yoheimuta / go-protoparser

Yet another Go package which parses a Protocol Buffer file (proto2+proto3)
MIT License
165 stars 20 forks source link

Parser panics when double semi-colon in service option #84

Open tardyp opened 3 months ago

tardyp commented 3 months ago

test case

Here is a simple reprod:

syntax = "proto3";
import "google/protobuf/descriptor.proto";

extend google.protobuf.ServiceOptions  {
  string service_description = 51000;
}

service MyService{
  option(service_description) = "description";;
}

note that there is a mistake in the file, with a double semicolon after description.

actual behaviour

when running protolint on this file, we got a crash:


protolint lint test.proto
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x18 pc=0x527104]

goroutine 1 [running]:
github.com/yoheimuta/go-protoparser/v4/parser.(*Service).Accept(0xc0001b45a0, {0xb52a20, 0xc000008bd0})
        /home/runner/go/pkg/mod/github.com/yoheimuta/go-protoparser/v4@v4.7.0/parser/service.go:90 +0x64
github.com/yoheimuta/go-protoparser/v4/parser.(*Proto).Accept(0xc000222750?, {0xb52a20, 0xc000008bd0})
        /home/runner/go/pkg/mod/github.com/yoheimuta/go-protoparser/v4@v4.7.0/parser/proto.go:26 +0x69
github.com/yoheimuta/protolint/linter/visitor.RunVisitorAutoDisable({0xb53b88?, 0xc000224a80?}, 0xc000222750, {0xa7185b, 0x10}, 0x5?)
        /home/runner/work/protolint/protolint/linter/visitor/hasExtendedVisitor.go:55 +0x119
github.com/yoheimuta/protolint/linter/visitor.RunVisitor(...)
        /home/runner/work/protolint/protolint/linter/visitor/hasExtendedVisitor.go:28
github.com/yoheimuta/protolint/internal/addon/rules.QuoteConsistentRule.Apply({{{0xa68c01?, 0x15?}}, 0xc00001e82d?, 0xa?}, 0xc00019e600?)
        /home/runner/work/protolint/protolint/internal/addon/rules/quoteConsistentRule.go:60 +0xa7
github.com/yoheimuta/protolint/internal/linter.(*Linter).Run(0xc00000b6e0?, 0xc000177758, {0xc000228180?, 0x7, 0x0?})
        /home/runner/work/protolint/protolint/internal/linter/linter.go:33 +0x10e
github.com/yoheimuta/protolint/internal/cmd/subcmds/lint.(*CmdLint).runOneFile(0xc0001c4380, {{0xc00001e810, 0x27}, {0xc00001e82d, 0xa}})
        /home/runner/work/protolint/protolint/internal/cmd/subcmds/lint/cmdLint.go:131 +0x151
github.com/yoheimuta/protolint/internal/cmd/subcmds/lint.(*CmdLint).run(0xc0001c4380)
        /home/runner/work/protolint/protolint/internal/cmd/subcmds/lint/cmdLint.go:100 +0xd6
github.com/yoheimuta/protolint/internal/cmd/subcmds/lint.(*CmdLint).Run(0xc0001c4380)
        /home/runner/work/protolint/protolint/internal/cmd/subcmds/lint/cmdLint.go:77 +0x53
github.com/yoheimuta/protolint/internal/cmd.doLint({0xc0000360e0?, 0x100000000?, 0x0?}, {0xb46980, 0xc00005e028}, {0xb46980, 0xc00005e030})
        /home/runner/work/protolint/protolint/internal/cmd/cmd.go:110 +0x2d1
github.com/yoheimuta/protolint/internal/cmd.doSub({0xc0000360d0?, 0x0?, 0x1d8e0249df8?}, {0xb46980?, 0xc00005e028?}, {0xb46980?, 0xc00005e030?})
        /home/runner/work/protolint/protolint/internal/cmd/cmd.go:64 +0xac
github.com/yoheimuta/protolint/internal/cmd.Do({0xc0000360d0?, 0x60?, 0x0?}, {0xb46980?, 0xc00005e028?}, {0xb46980?, 0xc00005e030?})
        /home/runner/work/protolint/protolint/internal/cmd/cmd.go:49 +0x78
main.main()
        /home/runner/work/protolint/protolint/cmd/protolint/main.go:11 +0x5e

protoc correctly handles this by reporting a syntax error.

Expected behaviour:

protolint should not panic, and rather output a syntax error like protoc

yoheimuta commented 2 months ago

@tardyp Thank you for your suggestion. You are right. Expected behaviour is better.