encoding/jsonpb: fix parsing of number strings containing leading/trailing spaces

Per conformance tests, number strings that contain leading or trailing
spaces are not allowed.

https://github.com/protocolbuffers/protobuf/blob/3a3956e8a258784461270961c6577341356bce52/conformance/binary_json_conformance_suite.cc#L1196-L1203

Change-Id: Ifbe0e4ee125fac3c291b456eece541353025cdd4
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/173664
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/encoding/jsonpb/decode.go b/encoding/jsonpb/decode.go
index 4b46ffc..4b0d9bb 100644
--- a/encoding/jsonpb/decode.go
+++ b/encoding/jsonpb/decode.go
@@ -376,7 +376,11 @@
 
 	case json.String:
 		// Decode number from string.
-		dec := json.NewDecoder([]byte(jval.String()))
+		s := strings.TrimSpace(jval.String())
+		if len(s) != len(jval.String()) {
+			return pref.Value{}, errors.New("invalid number %v", jval.Raw())
+		}
+		dec := json.NewDecoder([]byte(s))
 		var nerr errors.NonFatal
 		jval, err := dec.Read()
 		if !nerr.Merge(err) {
@@ -405,7 +409,11 @@
 
 	case json.String:
 		// Decode number from string.
-		dec := json.NewDecoder([]byte(jval.String()))
+		s := strings.TrimSpace(jval.String())
+		if len(s) != len(jval.String()) {
+			return pref.Value{}, errors.New("invalid number %v", jval.Raw())
+		}
+		dec := json.NewDecoder([]byte(s))
 		var nerr errors.NonFatal
 		jval, err := dec.Read()
 		if !nerr.Merge(err) {
@@ -452,6 +460,9 @@
 			return pref.ValueOf(math.Inf(-1)), nil
 		}
 		// Decode number from string.
+		if len(s) != len(strings.TrimSpace(s)) {
+			return pref.Value{}, errors.New("invalid number %v", jval.Raw())
+		}
 		dec := json.NewDecoder([]byte(s))
 		var nerr errors.NonFatal
 		jval, err := dec.Read()
diff --git a/encoding/jsonpb/decode_test.go b/encoding/jsonpb/decode_test.go
index 9fb95d6..6226b07 100644
--- a/encoding/jsonpb/decode_test.go
+++ b/encoding/jsonpb/decode_test.go
@@ -253,6 +253,16 @@
 			SDouble: math.Inf(-1),
 		},
 	}, {
+		desc:         "float string with leading space",
+		inputMessage: &pb3.Scalars{},
+		inputText:    `{"sFloat": " 1.234"}`,
+		wantErr:      true,
+	}, {
+		desc:         "double string with trailing space",
+		inputMessage: &pb3.Scalars{},
+		inputText:    `{"sDouble": "5.678 "}`,
+		wantErr:      true,
+	}, {
 		desc:         "not float",
 		inputMessage: &pb3.Scalars{},
 		inputText:    `{"sFloat": true}`,
@@ -324,6 +334,16 @@
 			SInt32: 12,
 		},
 	}, {
+		desc:         "integer string with leading space",
+		inputMessage: &pb3.Scalars{},
+		inputText:    `{"sInt32": " 1234"}`,
+		wantErr:      true,
+	}, {
+		desc:         "integer string with trailing space",
+		inputMessage: &pb3.Scalars{},
+		inputText:    `{"sUint32": "1e2 "}`,
+		wantErr:      true,
+	}, {
 		desc:         "number is not an integer",
 		inputMessage: &pb3.Scalars{},
 		inputText:    `{"sInt32": 1.001}`,