proto, jsonpb: fix handling of extensions
Check whether the parsed extension type actually matches the
target message type.
Change-Id: Ib21226b0bc217e33ebf56a1961ebc20732b5c64e
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/220438
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/jsonpb/decode.go b/jsonpb/decode.go
index 22c8eca..dd18be8 100644
--- a/jsonpb/decode.go
+++ b/jsonpb/decode.go
@@ -361,6 +361,9 @@
}
delete(jsonObject, name)
fd := xt.TypeDescriptor()
+ if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
+ return fmt.Errorf("extension field %q does not extend message %q", xname, m.Descriptor().FullName())
+ }
// Unmarshal the field value.
if raw == nil || (string(raw) == "null" && !isSingularWellKnownValue(fd)) {
diff --git a/jsonpb/json_test.go b/jsonpb/json_test.go
index 027a228..15eed25 100644
--- a/jsonpb/json_test.go
+++ b/jsonpb/json_test.go
@@ -910,6 +910,8 @@
{"StringValue containing invalid character", `{"str": "\U00004E16\U0000754C"}`, &pb2.KnownTypes{}},
{"StructValue containing invalid character", `{"str": "\U00004E16\U0000754C"}`, &stpb.Struct{}},
{"repeated proto3 enum with non array input", `{"rFunny":"PUNS"}`, &pb3.Message{RFunny: []pb3.Message_Humour{}}},
+ {"unknown extension field", `{"[ext_unknown]": "value"}`, &pb2.Real{}},
+ {"extension field for wrong message", `{"[jsonpb_test.name]": "value"}`, &pb2.Complex{}},
}
func TestUnmarshalingBadInput(t *testing.T) {
diff --git a/proto/text_decode.go b/proto/text_decode.go
index a8ea634..6216513 100644
--- a/proto/text_decode.go
+++ b/proto/text_decode.go
@@ -236,6 +236,9 @@
return p.errorf("unrecognized extension %q", name)
}
fd := xt.TypeDescriptor()
+ if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
+ return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName())
+ }
if err := p.checkForColon(fd); err != nil {
return err
diff --git a/proto/text_test.go b/proto/text_test.go
index 343f93a..3f6edc5 100644
--- a/proto/text_test.go
+++ b/proto/text_test.go
@@ -1196,6 +1196,10 @@
buildExtStructTest(`count: 42 [proto2_test.Ext.more] {data:"Hello, world!"}`),
buildExtDataTest(`count: 42 [proto2_test.Ext.text]:"Hello, world!" [proto2_test.Ext.number]:1729`),
buildExtRepStringTest(`count: 42 [proto2_test.greeting]:"bula" [proto2_test.greeting]:"hola"`),
+ {
+ in: `[proto2_test.complex]:<>`,
+ err: `line 1.20: extension field "proto2_test.complex" does not extend message "proto2_test.MyMessage"`,
+ },
// Big all-in-one
{