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
 	{