encoding/jsonpb,textpb: fix handling of duplicate oneof fields

Unmarshaling should fail if multiple fields in the same oneof exists in
the input.

Change-Id: I76efd88681a50c18f3eaf770c9eb48727efb412b
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170517
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/encoding/jsonpb/decode.go b/encoding/jsonpb/decode.go
index 7655054..3d4a068 100644
--- a/encoding/jsonpb/decode.go
+++ b/encoding/jsonpb/decode.go
@@ -153,6 +153,7 @@
 	var nerr errors.NonFatal
 	var reqNums set.Ints
 	var seenNums set.Ints
+	var seenOneofs set.Ints
 
 	msgType := m.Type()
 	knownFields := m.KnownFields()
@@ -237,6 +238,15 @@
 				return errors.New("%v|%q: %v", fd.FullName(), name, err)
 			}
 		} else {
+			// If field is a oneof, check if it has already been set.
+			if od := fd.OneofType(); od != nil {
+				idx := uint64(od.Index())
+				if seenOneofs.Has(idx) {
+					return errors.New("%v: oneof is already set", od.FullName())
+				}
+				seenOneofs.Set(idx)
+			}
+
 			// Required or optional fields.
 			if err := o.unmarshalSingular(knownFields, fd); !nerr.Merge(err) {
 				return errors.New("%v|%q: %v", fd.FullName(), name, err)