proto: check for required fields in encoding/decoding
Change-Id: I0555a92e0399782f075b1dcd248e880dd48c7d6d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170579
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/proto/encode_gen.go b/proto/encode_gen.go
index d262133..46621c8 100644
--- a/proto/encode_gen.go
+++ b/proto/encode_gen.go
@@ -36,6 +36,7 @@
}
func (o MarshalOptions) marshalSingular(b []byte, num wire.Number, kind protoreflect.Kind, v protoreflect.Value) ([]byte, error) {
+ var nerr errors.NonFatal
switch kind {
case protoreflect.BoolKind:
b = wire.AppendVarint(b, wire.EncodeBool(v.Bool()))
@@ -74,19 +75,19 @@
var err error
b, pos = appendSpeculativeLength(b)
b, err = o.marshalMessage(b, v.Message())
- if err != nil {
- return nil, err
+ if !nerr.Merge(err) {
+ return b, err
}
b = finishSpeculativeLength(b, pos)
case protoreflect.GroupKind:
var err error
b, err = o.marshalMessage(b, v.Message())
- if err != nil {
- return nil, err
+ if !nerr.Merge(err) {
+ return b, err
}
b = wire.AppendVarint(b, wire.EncodeTag(num, wire.EndGroupType))
default:
- return nil, errors.New("invalid kind %v", kind)
+ return b, errors.New("invalid kind %v", kind)
}
- return b, nil
+ return b, nerr.E
}