10 "google.golang.org/protobuf/encoding/protowire" |
10 "google.golang.org/protobuf/encoding/protowire" |
11 "google.golang.org/protobuf/internal/errors" |
11 "google.golang.org/protobuf/internal/errors" |
12 "google.golang.org/protobuf/internal/flags" |
12 "google.golang.org/protobuf/internal/flags" |
13 "google.golang.org/protobuf/proto" |
13 "google.golang.org/protobuf/proto" |
14 "google.golang.org/protobuf/reflect/protoreflect" |
14 "google.golang.org/protobuf/reflect/protoreflect" |
15 preg "google.golang.org/protobuf/reflect/protoregistry" |
15 "google.golang.org/protobuf/reflect/protoregistry" |
16 "google.golang.org/protobuf/runtime/protoiface" |
16 "google.golang.org/protobuf/runtime/protoiface" |
17 piface "google.golang.org/protobuf/runtime/protoiface" |
|
18 ) |
17 ) |
19 |
18 |
20 var errDecode = errors.New("cannot parse invalid wire-format data") |
19 var errDecode = errors.New("cannot parse invalid wire-format data") |
|
20 var errRecursionDepth = errors.New("exceeded maximum recursion depth") |
21 |
21 |
22 type unmarshalOptions struct { |
22 type unmarshalOptions struct { |
23 flags protoiface.UnmarshalInputFlags |
23 flags protoiface.UnmarshalInputFlags |
24 resolver interface { |
24 resolver interface { |
25 FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) |
25 FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) |
26 FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) |
26 FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) |
27 } |
27 } |
|
28 depth int |
28 } |
29 } |
29 |
30 |
30 func (o unmarshalOptions) Options() proto.UnmarshalOptions { |
31 func (o unmarshalOptions) Options() proto.UnmarshalOptions { |
31 return proto.UnmarshalOptions{ |
32 return proto.UnmarshalOptions{ |
32 Merge: true, |
33 Merge: true, |
34 DiscardUnknown: o.DiscardUnknown(), |
35 DiscardUnknown: o.DiscardUnknown(), |
35 Resolver: o.resolver, |
36 Resolver: o.resolver, |
36 } |
37 } |
37 } |
38 } |
38 |
39 |
39 func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&piface.UnmarshalDiscardUnknown != 0 } |
40 func (o unmarshalOptions) DiscardUnknown() bool { |
|
41 return o.flags&protoiface.UnmarshalDiscardUnknown != 0 |
|
42 } |
40 |
43 |
41 func (o unmarshalOptions) IsDefault() bool { |
44 func (o unmarshalOptions) IsDefault() bool { |
42 return o.flags == 0 && o.resolver == preg.GlobalTypes |
45 return o.flags == 0 && o.resolver == protoregistry.GlobalTypes |
43 } |
46 } |
44 |
47 |
45 var lazyUnmarshalOptions = unmarshalOptions{ |
48 var lazyUnmarshalOptions = unmarshalOptions{ |
46 resolver: preg.GlobalTypes, |
49 resolver: protoregistry.GlobalTypes, |
|
50 depth: protowire.DefaultRecursionLimit, |
47 } |
51 } |
48 |
52 |
49 type unmarshalOutput struct { |
53 type unmarshalOutput struct { |
50 n int // number of bytes consumed |
54 n int // number of bytes consumed |
51 initialized bool |
55 initialized bool |
52 } |
56 } |
53 |
57 |
54 // unmarshal is protoreflect.Methods.Unmarshal. |
58 // unmarshal is protoreflect.Methods.Unmarshal. |
55 func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { |
59 func (mi *MessageInfo) unmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { |
56 var p pointer |
60 var p pointer |
57 if ms, ok := in.Message.(*messageState); ok { |
61 if ms, ok := in.Message.(*messageState); ok { |
58 p = ms.pointer() |
62 p = ms.pointer() |
59 } else { |
63 } else { |
60 p = in.Message.(*messageReflectWrapper).pointer() |
64 p = in.Message.(*messageReflectWrapper).pointer() |
61 } |
65 } |
62 out, err := mi.unmarshalPointer(in.Buf, p, 0, unmarshalOptions{ |
66 out, err := mi.unmarshalPointer(in.Buf, p, 0, unmarshalOptions{ |
63 flags: in.Flags, |
67 flags: in.Flags, |
64 resolver: in.Resolver, |
68 resolver: in.Resolver, |
|
69 depth: in.Depth, |
65 }) |
70 }) |
66 var flags piface.UnmarshalOutputFlags |
71 var flags protoiface.UnmarshalOutputFlags |
67 if out.initialized { |
72 if out.initialized { |
68 flags |= piface.UnmarshalInitialized |
73 flags |= protoiface.UnmarshalInitialized |
69 } |
74 } |
70 return piface.UnmarshalOutput{ |
75 return protoiface.UnmarshalOutput{ |
71 Flags: flags, |
76 Flags: flags, |
72 }, err |
77 }, err |
73 } |
78 } |
74 |
79 |
75 // errUnknown is returned during unmarshaling to indicate a parse error that |
80 // errUnknown is returned during unmarshaling to indicate a parse error that |
80 // This is a sentinel error which should never be visible to the user. |
85 // This is a sentinel error which should never be visible to the user. |
81 var errUnknown = errors.New("unknown") |
86 var errUnknown = errors.New("unknown") |
82 |
87 |
83 func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { |
88 func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { |
84 mi.init() |
89 mi.init() |
|
90 opts.depth-- |
|
91 if opts.depth < 0 { |
|
92 return out, errRecursionDepth |
|
93 } |
85 if flags.ProtoLegacy && mi.isMessageSet { |
94 if flags.ProtoLegacy && mi.isMessageSet { |
86 return unmarshalMessageSet(mi, b, p, opts) |
95 return unmarshalMessageSet(mi, b, p, opts) |
87 } |
96 } |
88 initialized := true |
97 initialized := true |
89 var requiredMask uint64 |
98 var requiredMask uint64 |
200 xt := x.Type() |
209 xt := x.Type() |
201 if xt == nil { |
210 if xt == nil { |
202 var err error |
211 var err error |
203 xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) |
212 xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) |
204 if err != nil { |
213 if err != nil { |
205 if err == preg.NotFound { |
214 if err == protoregistry.NotFound { |
206 return out, errUnknown |
215 return out, errUnknown |
207 } |
216 } |
208 return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) |
217 return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) |
209 } |
218 } |
210 } |
219 } |