vendor/google.golang.org/protobuf/internal/impl/decode.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
    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 	}