diff --git a/spdxexp/parse.go b/spdxexp/parse.go index 51f8d45..f66de71 100644 --- a/spdxexp/parse.go +++ b/spdxexp/parse.go @@ -380,7 +380,7 @@ func (t *tokenStream) parseWith() *string { } token := t.peek() - if token.role != exceptionToken { + if token == nil || token.role != exceptionToken { t.err = errors.New("expected exception after 'WITH'") return nil } diff --git a/spdxexp/parse_test.go b/spdxexp/parse_test.go index 707331d..1d19abe 100644 --- a/spdxexp/parse_test.go +++ b/spdxexp/parse_test.go @@ -1246,6 +1246,7 @@ func TestParseWith(t *testing.T) { {"WITH followed by EXCEPTION", getWithClauseTokens(1), "Bison-exception-2.2", false, 2, nil}, {"WITH not followed by EXCEPTION", getInvalidWithClauseTokens(1), "", true, 2, errors.New("expected exception after 'WITH'")}, {"not with", getOrClauseTokens(1), "", true, 1, nil}, + {"WITH not followed by any tokens", getMalformedWithClauseTokens(1), "", true, 2, errors.New("expected exception after 'WITH'")}, } for _, test := range tests { @@ -1292,6 +1293,13 @@ func getInvalidWithClauseTokens(index int) *tokenStream { return getTokenStream(tokens, index) } +func getMalformedWithClauseTokens(index int) *tokenStream { + var tokens []token + tokens = append(tokens, token{role: licenseToken, value: "Apache-2.0"}) + tokens = append(tokens, token{role: operatorToken, value: "WITH"}) + return getTokenStream(tokens, index) +} + func getAndClauseTokens(index int) *tokenStream { var tokens []token tokens = append(tokens, token{role: licenseToken, value: "MIT"})