Produce an error when unmarshaling text protos if a oneof field is set more than once. PiperOrigin-RevId: 137859856
diff --git a/proto/text_parser.go b/proto/text_parser.go index 4fd0531..a6bab2f 100644 --- a/proto/text_parser.go +++ b/proto/text_parser.go
@@ -592,7 +592,11 @@ props = oop.Prop nv := reflect.New(oop.Type.Elem()) dst = nv.Elem().Field(0) - sv.Field(oop.Field).Set(nv) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("oneof field '%s' is already set", name) + } + field.Set(nv) } if !dst.IsValid() { return p.errorf("unknown field name %q in %v", name, st)
diff --git a/proto/text_parser_test.go b/proto/text_parser_test.go index b26500b..d757ab3 100644 --- a/proto/text_parser_test.go +++ b/proto/text_parser_test.go
@@ -635,6 +635,17 @@ if !Equal(m, want) { t.Errorf("\n got %v\nwant %v", m, want) } + + const inOverwrite = `name:"Shrek" number:42` + m = new(Communique) + testErr := "line 1.13: oneof field 'number' is already set" + if err := UnmarshalText(inOverwrite, m); err == nil { + t.Errorf("TestOneofParsing: Didn't get expected error: %v", testErr) + } else if err.Error() != testErr { + t.Errorf("TestOneofParsing: Incorrect error.\nHave: %v\nWant: %v", + err.Error(), testErr) + } + } var benchInput string