diff options
Diffstat (limited to 'vendor/google.golang.org/protobuf/encoding')
7 files changed, 105 insertions, 73 deletions
diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go index 5f28148d8..f47902371 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/decode.go @@ -11,6 +11,7 @@ import (  	"strconv"  	"strings" +	"google.golang.org/protobuf/encoding/protowire"  	"google.golang.org/protobuf/internal/encoding/json"  	"google.golang.org/protobuf/internal/encoding/messageset"  	"google.golang.org/protobuf/internal/errors" @@ -23,7 +24,7 @@ import (  	"google.golang.org/protobuf/reflect/protoregistry"  ) -// Unmarshal reads the given []byte into the given proto.Message. +// Unmarshal reads the given []byte into the given [proto.Message].  // The provided message must be mutable (e.g., a non-nil pointer to a message).  func Unmarshal(b []byte, m proto.Message) error {  	return UnmarshalOptions{}.Unmarshal(b, m) @@ -37,7 +38,7 @@ type UnmarshalOptions struct {  	// required fields will not return an error.  	AllowPartial bool -	// If DiscardUnknown is set, unknown fields are ignored. +	// If DiscardUnknown is set, unknown fields and enum name values are ignored.  	DiscardUnknown bool  	// Resolver is used for looking up types when unmarshaling @@ -47,9 +48,13 @@ type UnmarshalOptions struct {  		protoregistry.MessageTypeResolver  		protoregistry.ExtensionTypeResolver  	} + +	// RecursionLimit limits how deeply messages may be nested. +	// If zero, a default limit is applied. +	RecursionLimit int  } -// Unmarshal reads the given []byte and populates the given proto.Message +// Unmarshal reads the given []byte and populates the given [proto.Message]  // using options in the UnmarshalOptions object.  // It will clear the message first before setting the fields.  // If it returns an error, the given message may be partially set. @@ -67,6 +72,9 @@ func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error {  	if o.Resolver == nil {  		o.Resolver = protoregistry.GlobalTypes  	} +	if o.RecursionLimit == 0 { +		o.RecursionLimit = protowire.DefaultRecursionLimit +	}  	dec := decoder{json.NewDecoder(b), o}  	if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { @@ -114,6 +122,10 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error {  // unmarshalMessage unmarshals a message into the given protoreflect.Message.  func (d decoder) unmarshalMessage(m protoreflect.Message, skipTypeURL bool) error { +	d.opts.RecursionLimit-- +	if d.opts.RecursionLimit < 0 { +		return errors.New("exceeded max recursion depth") +	}  	if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil {  		return unmarshal(d, m)  	} @@ -266,7 +278,9 @@ func (d decoder) unmarshalSingular(m protoreflect.Message, fd protoreflect.Field  	if err != nil {  		return err  	} -	m.Set(fd, val) +	if val.IsValid() { +		m.Set(fd, val) +	}  	return nil  } @@ -329,7 +343,7 @@ func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.  		}  	case protoreflect.EnumKind: -		if v, ok := unmarshalEnum(tok, fd); ok { +		if v, ok := unmarshalEnum(tok, fd, d.opts.DiscardUnknown); ok {  			return v, nil  		} @@ -474,7 +488,7 @@ func unmarshalBytes(tok json.Token) (protoreflect.Value, bool) {  	return protoreflect.ValueOfBytes(b), true  } -func unmarshalEnum(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflect.Value, bool) { +func unmarshalEnum(tok json.Token, fd protoreflect.FieldDescriptor, discardUnknown bool) (protoreflect.Value, bool) {  	switch tok.Kind() {  	case json.String:  		// Lookup EnumNumber based on name. @@ -482,6 +496,9 @@ func unmarshalEnum(tok json.Token, fd protoreflect.FieldDescriptor) (protoreflec  		if enumVal := fd.Enum().Values().ByName(protoreflect.Name(s)); enumVal != nil {  			return protoreflect.ValueOfEnum(enumVal.Number()), true  		} +		if discardUnknown { +			return protoreflect.Value{}, true +		}  	case json.Number:  		if n, ok := tok.Int(32); ok { @@ -542,7 +559,9 @@ func (d decoder) unmarshalList(list protoreflect.List, fd protoreflect.FieldDesc  			if err != nil {  				return err  			} -			list.Append(val) +			if val.IsValid() { +				list.Append(val) +			}  		}  	} @@ -609,8 +628,9 @@ Loop:  		if err != nil {  			return err  		} - -		mmap.Set(pkey, pval) +		if pval.IsValid() { +			mmap.Set(pkey, pval) +		}  	}  	return nil diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/doc.go b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go index 21d5d2cb1..ae71007c1 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/doc.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/doc.go @@ -6,6 +6,6 @@  // format. It follows the guide at  // https://protobuf.dev/programming-guides/proto3#json.  // -// This package produces a different output than the standard "encoding/json" +// This package produces a different output than the standard [encoding/json]  // package, which does not operate correctly on protocol buffer messages.  package protojson diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go index 66b95870e..3f75098b6 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/encode.go @@ -31,7 +31,7 @@ func Format(m proto.Message) string {  	return MarshalOptions{Multiline: true}.Format(m)  } -// Marshal writes the given proto.Message in JSON format using default options. +// Marshal writes the given [proto.Message] in JSON format using default options.  // Do not depend on the output being stable. It may change over time across  // different versions of the program.  func Marshal(m proto.Message) ([]byte, error) { @@ -81,6 +81,25 @@ type MarshalOptions struct {  	//  ╚═══════╧════════════════════════════╝  	EmitUnpopulated bool +	// EmitDefaultValues specifies whether to emit default-valued primitive fields, +	// empty lists, and empty maps. The fields affected are as follows: +	//  ╔═══════╤════════════════════════════════════════╗ +	//  ║ JSON  │ Protobuf field                         ║ +	//  ╠═══════╪════════════════════════════════════════╣ +	//  ║ false │ non-optional scalar boolean fields     ║ +	//  ║ 0     │ non-optional scalar numeric fields     ║ +	//  ║ ""    │ non-optional scalar string/byte fields ║ +	//  ║ []    │ empty repeated fields                  ║ +	//  ║ {}    │ empty map fields                       ║ +	//  ╚═══════╧════════════════════════════════════════╝ +	// +	// Behaves similarly to EmitUnpopulated, but does not emit "null"-value fields, +	// i.e. presence-sensing fields that are omitted will remain omitted to preserve +	// presence-sensing. +	// EmitUnpopulated takes precedence over EmitDefaultValues since the former generates +	// a strict superset of the latter. +	EmitDefaultValues bool +  	// Resolver is used for looking up types when expanding google.protobuf.Any  	// messages. If nil, this defaults to using protoregistry.GlobalTypes.  	Resolver interface { @@ -102,7 +121,7 @@ func (o MarshalOptions) Format(m proto.Message) string {  	return string(b)  } -// Marshal marshals the given proto.Message in the JSON format using options in +// Marshal marshals the given [proto.Message] in the JSON format using options in  // MarshalOptions. Do not depend on the output being stable. It may change over  // time across different versions of the program.  func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { @@ -178,7 +197,11 @@ func (m typeURLFieldRanger) Range(f func(protoreflect.FieldDescriptor, protorefl  // unpopulatedFieldRanger wraps a protoreflect.Message and modifies its Range  // method to additionally iterate over unpopulated fields. -type unpopulatedFieldRanger struct{ protoreflect.Message } +type unpopulatedFieldRanger struct { +	protoreflect.Message + +	skipNull bool +}  func (m unpopulatedFieldRanger) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {  	fds := m.Descriptor().Fields() @@ -192,6 +215,9 @@ func (m unpopulatedFieldRanger) Range(f func(protoreflect.FieldDescriptor, proto  		isProto2Scalar := fd.Syntax() == protoreflect.Proto2 && fd.Default().IsValid()  		isSingularMessage := fd.Cardinality() != protoreflect.Repeated && fd.Message() != nil  		if isProto2Scalar || isSingularMessage { +			if m.skipNull { +				continue +			}  			v = protoreflect.Value{} // use invalid value to emit null  		}  		if !f(fd, v) { @@ -217,8 +243,11 @@ func (e encoder) marshalMessage(m protoreflect.Message, typeURL string) error {  	defer e.EndObject()  	var fields order.FieldRanger = m -	if e.opts.EmitUnpopulated { -		fields = unpopulatedFieldRanger{m} +	switch { +	case e.opts.EmitUnpopulated: +		fields = unpopulatedFieldRanger{Message: m, skipNull: false} +	case e.opts.EmitDefaultValues: +		fields = unpopulatedFieldRanger{Message: m, skipNull: true}  	}  	if typeURL != "" {  		fields = typeURLFieldRanger{fields, typeURL} diff --git a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go index 6c37d4174..4b177c820 100644 --- a/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go +++ b/vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go @@ -176,7 +176,7 @@ func (d decoder) unmarshalAny(m protoreflect.Message) error {  	// Use another decoder to parse the unread bytes for @type field. This  	// avoids advancing a read from current decoder because the current JSON  	// object may contain the fields of the embedded type. -	dec := decoder{d.Clone(), UnmarshalOptions{}} +	dec := decoder{d.Clone(), UnmarshalOptions{RecursionLimit: d.opts.RecursionLimit}}  	tok, err := findTypeURL(dec)  	switch err {  	case errEmptyObject: @@ -308,48 +308,29 @@ Loop:  // array) in order to advance the read to the next JSON value. It relies on  // the decoder returning an error if the types are not in valid sequence.  func (d decoder) skipJSONValue() error { -	tok, err := d.Read() -	if err != nil { -		return err -	} -	// Only need to continue reading for objects and arrays. -	switch tok.Kind() { -	case json.ObjectOpen: -		for { -			tok, err := d.Read() -			if err != nil { -				return err -			} -			switch tok.Kind() { -			case json.ObjectClose: -				return nil -			case json.Name: -				// Skip object field value. -				if err := d.skipJSONValue(); err != nil { -					return err -				} -			} +	var open int +	for { +		tok, err := d.Read() +		if err != nil { +			return err  		} - -	case json.ArrayOpen: -		for { -			tok, err := d.Peek() -			if err != nil { -				return err -			} -			switch tok.Kind() { -			case json.ArrayClose: -				d.Read() -				return nil -			default: -				// Skip array item. -				if err := d.skipJSONValue(); err != nil { -					return err -				} +		switch tok.Kind() { +		case json.ObjectClose, json.ArrayClose: +			open-- +		case json.ObjectOpen, json.ArrayOpen: +			open++ +			if open > d.opts.RecursionLimit { +				return errors.New("exceeded max recursion depth")  			} +		case json.EOF: +			// This can only happen if there's a bug in Decoder.Read. +			// Avoid an infinite loop if this does happen. +			return errors.New("unexpected EOF") +		} +		if open == 0 { +			return nil  		}  	} -	return nil  }  // unmarshalAnyValue unmarshals the given custom-type message from the JSON diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 4921b2d4a..a45f112bc 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -21,7 +21,7 @@ import (  	"google.golang.org/protobuf/reflect/protoregistry"  ) -// Unmarshal reads the given []byte into the given proto.Message. +// Unmarshal reads the given []byte into the given [proto.Message].  // The provided message must be mutable (e.g., a non-nil pointer to a message).  func Unmarshal(b []byte, m proto.Message) error {  	return UnmarshalOptions{}.Unmarshal(b, m) @@ -51,7 +51,7 @@ type UnmarshalOptions struct {  	}  } -// Unmarshal reads the given []byte and populates the given proto.Message +// Unmarshal reads the given []byte and populates the given [proto.Message]  // using options in the UnmarshalOptions object.  // The provided message must be mutable (e.g., a non-nil pointer to a message).  func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { @@ -739,7 +739,9 @@ func (d decoder) skipValue() error {  			case text.ListClose:  				return nil  			case text.MessageOpen: -				return d.skipMessageValue() +				if err := d.skipMessageValue(); err != nil { +					return err +				}  			default:  				// Skip items. This will not validate whether skipped values are  				// of the same type or not, same behavior as C++ diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index 722a7b41d..95967e811 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -33,7 +33,7 @@ func Format(m proto.Message) string {  	return MarshalOptions{Multiline: true}.Format(m)  } -// Marshal writes the given proto.Message in textproto format using default +// Marshal writes the given [proto.Message] in textproto format using default  // options. Do not depend on the output being stable. It may change over time  // across different versions of the program.  func Marshal(m proto.Message) ([]byte, error) { @@ -97,7 +97,7 @@ func (o MarshalOptions) Format(m proto.Message) string {  	return string(b)  } -// Marshal writes the given proto.Message in textproto format using options in +// Marshal writes the given [proto.Message] in textproto format using options in  // MarshalOptions object. Do not depend on the output being stable. It may  // change over time across different versions of the program.  func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index f4b4686cf..e942bc983 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -6,7 +6,7 @@  // See https://protobuf.dev/programming-guides/encoding.  //  // For marshaling and unmarshaling entire protobuf messages, -// use the "google.golang.org/protobuf/proto" package instead. +// use the [google.golang.org/protobuf/proto] package instead.  package protowire  import ( @@ -87,7 +87,7 @@ func ParseError(n int) error {  // ConsumeField parses an entire field record (both tag and value) and returns  // the field number, the wire type, and the total length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  //  // The total length includes the tag header and the end group marker (if the  // field is a group). @@ -104,8 +104,8 @@ func ConsumeField(b []byte) (Number, Type, int) {  }  // ConsumeFieldValue parses a field value and returns its length. -// This assumes that the field Number and wire Type have already been parsed. -// This returns a negative length upon an error (see ParseError). +// This assumes that the field [Number] and wire [Type] have already been parsed. +// This returns a negative length upon an error (see [ParseError]).  //  // When parsing a group, the length includes the end group marker and  // the end group is verified to match the starting field number. @@ -164,7 +164,7 @@ func AppendTag(b []byte, num Number, typ Type) []byte {  }  // ConsumeTag parses b as a varint-encoded tag, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeTag(b []byte) (Number, Type, int) {  	v, n := ConsumeVarint(b)  	if n < 0 { @@ -263,7 +263,7 @@ func AppendVarint(b []byte, v uint64) []byte {  }  // ConsumeVarint parses b as a varint-encoded uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeVarint(b []byte) (v uint64, n int) {  	var y uint64  	if len(b) <= 0 { @@ -384,7 +384,7 @@ func AppendFixed32(b []byte, v uint32) []byte {  }  // ConsumeFixed32 parses b as a little-endian uint32, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeFixed32(b []byte) (v uint32, n int) {  	if len(b) < 4 {  		return 0, errCodeTruncated @@ -412,7 +412,7 @@ func AppendFixed64(b []byte, v uint64) []byte {  }  // ConsumeFixed64 parses b as a little-endian uint64, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeFixed64(b []byte) (v uint64, n int) {  	if len(b) < 8 {  		return 0, errCodeTruncated @@ -432,7 +432,7 @@ func AppendBytes(b []byte, v []byte) []byte {  }  // ConsumeBytes parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeBytes(b []byte) (v []byte, n int) {  	m, n := ConsumeVarint(b)  	if n < 0 { @@ -456,7 +456,7 @@ func AppendString(b []byte, v string) []byte {  }  // ConsumeString parses b as a length-prefixed bytes value, reporting its length. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeString(b []byte) (v string, n int) {  	bb, n := ConsumeBytes(b)  	return string(bb), n @@ -471,7 +471,7 @@ func AppendGroup(b []byte, num Number, v []byte) []byte {  // ConsumeGroup parses b as a group value until the trailing end group marker,  // and verifies that the end marker matches the provided num. The value v  // does not contain the end marker, while the length does contain the end marker. -// This returns a negative length upon an error (see ParseError). +// This returns a negative length upon an error (see [ParseError]).  func ConsumeGroup(num Number, b []byte) (v []byte, n int) {  	n = ConsumeFieldValue(num, StartGroupType, b)  	if n < 0 { @@ -495,8 +495,8 @@ func SizeGroup(num Number, n int) int {  	return n + SizeTag(num)  } -// DecodeTag decodes the field Number and wire Type from its unified form. -// The Number is -1 if the decoded field number overflows int32. +// DecodeTag decodes the field [Number] and wire [Type] from its unified form. +// The [Number] is -1 if the decoded field number overflows int32.  // Other than overflow, this does not check for field number validity.  func DecodeTag(x uint64) (Number, Type) {  	// NOTE: MessageSet allows for larger field numbers than normal. @@ -506,7 +506,7 @@ func DecodeTag(x uint64) (Number, Type) {  	return Number(x >> 3), Type(x & 7)  } -// EncodeTag encodes the field Number and wire Type into its unified form. +// EncodeTag encodes the field [Number] and wire [Type] into its unified form.  func EncodeTag(num Number, typ Type) uint64 {  	return uint64(num)<<3 | uint64(typ&7)  }  | 
