diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-11-18 14:55:20 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-11-18 18:25:20 +0100 |
| commit | 0767f13fbd87c99aea7893eb64199b76be42cd61 (patch) | |
| tree | 81c121cc8f35e879bc1457c489e0278e0fcf25ae /pkg/compiler | |
| parent | 09323409cdbe048449a5a6819c076492c166f18a (diff) | |
pkg/compiler: fix crash on invalid templates
Discovered by go-fuzz/OSS-Fuzz:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=27599
Diffstat (limited to 'pkg/compiler')
| -rw-r--r-- | pkg/compiler/check.go | 7 | ||||
| -rw-r--r-- | pkg/compiler/compiler_test.go | 8 |
2 files changed, 13 insertions, 2 deletions
diff --git a/pkg/compiler/check.go b/pkg/compiler/check.go index 022581771..6da7e3ddf 100644 --- a/pkg/compiler/check.go +++ b/pkg/compiler/check.go @@ -967,13 +967,16 @@ func (comp *compiler) replaceTypedef(ctx *checkCtx, t *ast.Type, flags checkFlag } } t.Pos = pos0 + comp.maybeRemoveBase(t, flags) +} +func (comp *compiler) maybeRemoveBase(t *ast.Type, flags checkFlags) { // Remove base type if it's not needed in this context. // If desc is nil, will return an error later when we typecheck the result. desc := comp.getTypeDesc(t) - if desc != nil && flags&checkIsArg != 0 && desc.NeedBase { + if desc != nil && flags&checkIsArg != 0 && desc.NeedBase && len(t.Args) != 0 { baseTypePos := len(t.Args) - 1 - if t.Args[baseTypePos].Ident == "opt" { + if t.Args[baseTypePos].Ident == "opt" && len(t.Args) >= 2 { baseTypePos-- } copy(t.Args[baseTypePos:], t.Args[baseTypePos+1:]) diff --git a/pkg/compiler/compiler_test.go b/pkg/compiler/compiler_test.go index 9bc93a519..131270939 100644 --- a/pkg/compiler/compiler_test.go +++ b/pkg/compiler/compiler_test.go @@ -151,6 +151,14 @@ type p b[L] type b[L] { e b[L[L]] }`, + ` +p() b[len] +type b[b] b +`, + ` +p() b[len[opt]] +type b[b] b +`, } { Fuzz([]byte(data)[:len(data):len(data)]) } |
