mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
build(deps): bump google.golang.org/protobuf from 1.36.10 to 1.36.11
Bumps google.golang.org/protobuf from 1.36.10 to 1.36.11. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-version: 1.36.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
@@ -24,7 +24,7 @@ require (
|
|||||||
github.com/vishvananda/netns v0.0.5
|
github.com/vishvananda/netns v0.0.5
|
||||||
golang.org/x/net v0.48.0
|
golang.org/x/net v0.48.0
|
||||||
golang.org/x/sys v0.39.0
|
golang.org/x/sys v0.39.0
|
||||||
google.golang.org/protobuf v1.36.10
|
google.golang.org/protobuf v1.36.11
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
||||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
|
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||||
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
+9
-2
@@ -32,7 +32,7 @@ var byteType = reflect.TypeOf(byte(0))
|
|||||||
func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor {
|
func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor {
|
||||||
f := new(filedesc.Field)
|
f := new(filedesc.Field)
|
||||||
f.L0.ParentFile = filedesc.SurrogateProto2
|
f.L0.ParentFile = filedesc.SurrogateProto2
|
||||||
f.L1.EditionFeatures = f.L0.ParentFile.L1.EditionFeatures
|
packed := false
|
||||||
for len(tag) > 0 {
|
for len(tag) > 0 {
|
||||||
i := strings.IndexByte(tag, ',')
|
i := strings.IndexByte(tag, ',')
|
||||||
if i < 0 {
|
if i < 0 {
|
||||||
@@ -108,7 +108,7 @@ func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescri
|
|||||||
f.L1.StringName.InitJSON(jsonName)
|
f.L1.StringName.InitJSON(jsonName)
|
||||||
}
|
}
|
||||||
case s == "packed":
|
case s == "packed":
|
||||||
f.L1.EditionFeatures.IsPacked = true
|
packed = true
|
||||||
case strings.HasPrefix(s, "def="):
|
case strings.HasPrefix(s, "def="):
|
||||||
// The default tag is special in that everything afterwards is the
|
// The default tag is special in that everything afterwards is the
|
||||||
// default regardless of the presence of commas.
|
// default regardless of the presence of commas.
|
||||||
@@ -121,6 +121,13 @@ func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescri
|
|||||||
tag = strings.TrimPrefix(tag[i:], ",")
|
tag = strings.TrimPrefix(tag[i:], ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update EditionFeatures after the loop and after we know whether this is
|
||||||
|
// a proto2 or proto3 field.
|
||||||
|
f.L1.EditionFeatures = f.L0.ParentFile.L1.EditionFeatures
|
||||||
|
if packed {
|
||||||
|
f.L1.EditionFeatures.IsPacked = true
|
||||||
|
}
|
||||||
|
|
||||||
// The generator uses the group message name instead of the field name.
|
// The generator uses the group message name instead of the field name.
|
||||||
// We obtain the real field name by lowercasing the group name.
|
// We obtain the real field name by lowercasing the group name.
|
||||||
if f.L1.Kind == protoreflect.GroupKind {
|
if f.L1.Kind == protoreflect.GroupKind {
|
||||||
|
|||||||
+82
-39
@@ -424,27 +424,34 @@ func (d *Decoder) parseFieldName() (tok Token, err error) {
|
|||||||
return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in))
|
return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in))
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseTypeName parses Any type URL or extension field name. The name is
|
// parseTypeName parses an Any type URL or an extension field name. The name is
|
||||||
// enclosed in [ and ] characters. The C++ parser does not handle many legal URL
|
// enclosed in [ and ] characters. We allow almost arbitrary type URL prefixes,
|
||||||
// strings. This implementation is more liberal and allows for the pattern
|
// closely following the text-format spec [1,2]. We implement "ExtensionName |
|
||||||
// ^[-_a-zA-Z0-9]+([./][-_a-zA-Z0-9]+)*`). Whitespaces and comments are allowed
|
// AnyName" as follows (with some exceptions for backwards compatibility):
|
||||||
// in between [ ], '.', '/' and the sub names.
|
//
|
||||||
|
// char = [-_a-zA-Z0-9]
|
||||||
|
// url_char = char | [.~!$&'()*+,;=] | "%", hex, hex
|
||||||
|
//
|
||||||
|
// Ident = char, { char }
|
||||||
|
// TypeName = Ident, { ".", Ident } ;
|
||||||
|
// UrlPrefix = url_char, { url_char | "/" } ;
|
||||||
|
// ExtensionName = "[", TypeName, "]" ;
|
||||||
|
// AnyName = "[", UrlPrefix, "/", TypeName, "]" ;
|
||||||
|
//
|
||||||
|
// Additionally, we allow arbitrary whitespace and comments between [ and ].
|
||||||
|
//
|
||||||
|
// [1] https://protobuf.dev/reference/protobuf/textformat-spec/#characters
|
||||||
|
// [2] https://protobuf.dev/reference/protobuf/textformat-spec/#field-names
|
||||||
func (d *Decoder) parseTypeName() (Token, error) {
|
func (d *Decoder) parseTypeName() (Token, error) {
|
||||||
startPos := len(d.orig) - len(d.in)
|
|
||||||
// Use alias s to advance first in order to use d.in for error handling.
|
// Use alias s to advance first in order to use d.in for error handling.
|
||||||
// Caller already checks for [ as first character.
|
// Caller already checks for [ as first character (d.in[0] == '[').
|
||||||
s := consume(d.in[1:], 0)
|
s := consume(d.in[1:], 0)
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
return Token{}, ErrUnexpectedEOF
|
return Token{}, ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Collect everything between [ and ] in name.
|
||||||
var name []byte
|
var name []byte
|
||||||
for len(s) > 0 && isTypeNameChar(s[0]) {
|
|
||||||
name = append(name, s[0])
|
|
||||||
s = s[1:]
|
|
||||||
}
|
|
||||||
s = consume(s, 0)
|
|
||||||
|
|
||||||
var closed bool
|
var closed bool
|
||||||
for len(s) > 0 && !closed {
|
for len(s) > 0 && !closed {
|
||||||
switch {
|
switch {
|
||||||
@@ -452,23 +459,20 @@ func (d *Decoder) parseTypeName() (Token, error) {
|
|||||||
s = s[1:]
|
s = s[1:]
|
||||||
closed = true
|
closed = true
|
||||||
|
|
||||||
case s[0] == '/', s[0] == '.':
|
case s[0] == '/' || isTypeNameChar(s[0]) || isUrlExtraChar(s[0]):
|
||||||
if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') {
|
|
||||||
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
|
|
||||||
d.orig[startPos:len(d.orig)-len(s)+1])
|
|
||||||
}
|
|
||||||
name = append(name, s[0])
|
name = append(name, s[0])
|
||||||
s = s[1:]
|
s = consume(s[1:], 0)
|
||||||
s = consume(s, 0)
|
|
||||||
for len(s) > 0 && isTypeNameChar(s[0]) {
|
// URL percent-encoded chars
|
||||||
name = append(name, s[0])
|
case s[0] == '%':
|
||||||
s = s[1:]
|
if len(s) < 3 || !isHexChar(s[1]) || !isHexChar(s[2]) {
|
||||||
|
return Token{}, d.parseTypeNameError(s, 3)
|
||||||
}
|
}
|
||||||
s = consume(s, 0)
|
name = append(name, s[0], s[1], s[2])
|
||||||
|
s = consume(s[3:], 0)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return Token{}, d.newSyntaxError(
|
return Token{}, d.parseTypeNameError(s, 1)
|
||||||
"invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -476,15 +480,38 @@ func (d *Decoder) parseTypeName() (Token, error) {
|
|||||||
return Token{}, ErrUnexpectedEOF
|
return Token{}, ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
|
|
||||||
// First character cannot be '.'. Last character cannot be '.' or '/'.
|
// Split collected name on last '/' into urlPrefix and typeName (if '/' is
|
||||||
size := len(name)
|
// present).
|
||||||
if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' {
|
typeName := name
|
||||||
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
|
if i := bytes.LastIndexByte(name, '/'); i != -1 {
|
||||||
d.orig[startPos:len(d.orig)-len(s)])
|
urlPrefix := name[:i]
|
||||||
|
typeName = name[i+1:]
|
||||||
|
|
||||||
|
// urlPrefix may be empty (for backwards compatibility).
|
||||||
|
// If non-empty, it must not start with '/'.
|
||||||
|
if len(urlPrefix) > 0 && urlPrefix[0] == '/' {
|
||||||
|
return Token{}, d.parseTypeNameError(s, 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// typeName must not be empty (note: "" splits to [""]) and all identifier
|
||||||
|
// parts must not be empty.
|
||||||
|
for _, ident := range bytes.Split(typeName, []byte{'.'}) {
|
||||||
|
if len(ident) == 0 {
|
||||||
|
return Token{}, d.parseTypeNameError(s, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// typeName must not contain any percent-encoded or special URL chars.
|
||||||
|
for _, b := range typeName {
|
||||||
|
if b == '%' || (b != '.' && isUrlExtraChar(b)) {
|
||||||
|
return Token{}, d.parseTypeNameError(s, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
startPos := len(d.orig) - len(d.in)
|
||||||
|
endPos := len(d.orig) - len(s)
|
||||||
d.in = s
|
d.in = s
|
||||||
endPos := len(d.orig) - len(d.in)
|
|
||||||
d.consume(0)
|
d.consume(0)
|
||||||
|
|
||||||
return Token{
|
return Token{
|
||||||
@@ -496,16 +523,32 @@ func (d *Decoder) parseTypeName() (Token, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isTypeNameChar(b byte) bool {
|
func (d *Decoder) parseTypeNameError(s []byte, numUnconsumedChars int) error {
|
||||||
return (b == '-' || b == '_' ||
|
return d.newSyntaxError(
|
||||||
('0' <= b && b <= '9') ||
|
"invalid type URL/extension field name: %s",
|
||||||
('a' <= b && b <= 'z') ||
|
d.in[:len(d.in)-len(s)+min(numUnconsumedChars, len(s))],
|
||||||
('A' <= b && b <= 'Z'))
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isWhiteSpace(b byte) bool {
|
func isHexChar(b byte) bool {
|
||||||
|
return ('0' <= b && b <= '9') ||
|
||||||
|
('a' <= b && b <= 'f') ||
|
||||||
|
('A' <= b && b <= 'F')
|
||||||
|
}
|
||||||
|
|
||||||
|
func isTypeNameChar(b byte) bool {
|
||||||
|
return b == '-' || b == '_' ||
|
||||||
|
('0' <= b && b <= '9') ||
|
||||||
|
('a' <= b && b <= 'z') ||
|
||||||
|
('A' <= b && b <= 'Z')
|
||||||
|
}
|
||||||
|
|
||||||
|
// isUrlExtraChar complements isTypeNameChar with extra characters that we allow
|
||||||
|
// in URLs but not in type names. Note that '/' is not included so that it can
|
||||||
|
// be treated specially.
|
||||||
|
func isUrlExtraChar(b byte) bool {
|
||||||
switch b {
|
switch b {
|
||||||
case ' ', '\n', '\r', '\t':
|
case '.', '~', '!', '$', '&', '(', ')', '*', '+', ',', ';', '=':
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
|
|||||||
+1
@@ -32,6 +32,7 @@ const (
|
|||||||
EditionProto3 Edition = 999
|
EditionProto3 Edition = 999
|
||||||
Edition2023 Edition = 1000
|
Edition2023 Edition = 1000
|
||||||
Edition2024 Edition = 1001
|
Edition2024 Edition = 1001
|
||||||
|
EditionUnstable Edition = 9999
|
||||||
EditionUnsupported Edition = 100000
|
EditionUnsupported Edition = 100000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
-22
@@ -330,7 +330,6 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
|
|||||||
md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
||||||
extensionIdx++
|
extensionIdx++
|
||||||
case genid.DescriptorProto_Options_field_number:
|
case genid.DescriptorProto_Options_field_number:
|
||||||
md.unmarshalOptions(v)
|
|
||||||
rawOptions = appendOptions(rawOptions, v)
|
rawOptions = appendOptions(rawOptions, v)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -356,27 +355,6 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
|
|||||||
md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
|
md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (md *Message) unmarshalOptions(b []byte) {
|
|
||||||
for len(b) > 0 {
|
|
||||||
num, typ, n := protowire.ConsumeTag(b)
|
|
||||||
b = b[n:]
|
|
||||||
switch typ {
|
|
||||||
case protowire.VarintType:
|
|
||||||
v, m := protowire.ConsumeVarint(b)
|
|
||||||
b = b[m:]
|
|
||||||
switch num {
|
|
||||||
case genid.MessageOptions_MapEntry_field_number:
|
|
||||||
md.L1.IsMapEntry = protowire.DecodeBool(v)
|
|
||||||
case genid.MessageOptions_MessageSetWireFormat_field_number:
|
|
||||||
md.L1.IsMessageSet = protowire.DecodeBool(v)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
|
||||||
b = b[m:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
|
func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
|
||||||
for len(b) > 0 {
|
for len(b) > 0 {
|
||||||
num, typ, n := protowire.ConsumeTag(b)
|
num, typ, n := protowire.ConsumeTag(b)
|
||||||
|
|||||||
+1
@@ -26,6 +26,7 @@ const (
|
|||||||
Edition_EDITION_PROTO3_enum_value = 999
|
Edition_EDITION_PROTO3_enum_value = 999
|
||||||
Edition_EDITION_2023_enum_value = 1000
|
Edition_EDITION_2023_enum_value = 1000
|
||||||
Edition_EDITION_2024_enum_value = 1001
|
Edition_EDITION_2024_enum_value = 1001
|
||||||
|
Edition_EDITION_UNSTABLE_enum_value = 9999
|
||||||
Edition_EDITION_1_TEST_ONLY_enum_value = 1
|
Edition_EDITION_1_TEST_ONLY_enum_value = 1
|
||||||
Edition_EDITION_2_TEST_ONLY_enum_value = 2
|
Edition_EDITION_2_TEST_ONLY_enum_value = 2
|
||||||
Edition_EDITION_99997_TEST_ONLY_enum_value = 99997
|
Edition_EDITION_99997_TEST_ONLY_enum_value = 99997
|
||||||
|
|||||||
+6
@@ -113,6 +113,9 @@ func sizeMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalO
|
|||||||
}
|
}
|
||||||
|
|
||||||
func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, errRecursionDepth
|
||||||
|
}
|
||||||
if wtyp != protowire.BytesType {
|
if wtyp != protowire.BytesType {
|
||||||
return out, errUnknown
|
return out, errUnknown
|
||||||
}
|
}
|
||||||
@@ -170,6 +173,9 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, errRecursionDepth
|
||||||
|
}
|
||||||
if wtyp != protowire.BytesType {
|
if wtyp != protowire.BytesType {
|
||||||
return out, errUnknown
|
return out, errUnknown
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -102,8 +102,7 @@ var errUnknown = errors.New("unknown")
|
|||||||
|
|
||||||
func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||||
mi.init()
|
mi.init()
|
||||||
opts.depth--
|
if opts.depth--; opts.depth < 0 {
|
||||||
if opts.depth < 0 {
|
|
||||||
return out, errRecursionDepth
|
return out, errRecursionDepth
|
||||||
}
|
}
|
||||||
if flags.ProtoLegacy && mi.isMessageSet {
|
if flags.ProtoLegacy && mi.isMessageSet {
|
||||||
|
|||||||
+26
@@ -68,9 +68,13 @@ func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out pr
|
|||||||
if in.Resolver == nil {
|
if in.Resolver == nil {
|
||||||
in.Resolver = protoregistry.GlobalTypes
|
in.Resolver = protoregistry.GlobalTypes
|
||||||
}
|
}
|
||||||
|
if in.Depth == 0 {
|
||||||
|
in.Depth = protowire.DefaultRecursionLimit
|
||||||
|
}
|
||||||
o, st := mi.validate(in.Buf, 0, unmarshalOptions{
|
o, st := mi.validate(in.Buf, 0, unmarshalOptions{
|
||||||
flags: in.Flags,
|
flags: in.Flags,
|
||||||
resolver: in.Resolver,
|
resolver: in.Resolver,
|
||||||
|
depth: in.Depth,
|
||||||
})
|
})
|
||||||
if o.initialized {
|
if o.initialized {
|
||||||
out.Flags |= protoiface.UnmarshalInitialized
|
out.Flags |= protoiface.UnmarshalInitialized
|
||||||
@@ -257,6 +261,9 @@ func (mi *MessageInfo) validate(b []byte, groupTag protowire.Number, opts unmars
|
|||||||
states[0].typ = validationTypeGroup
|
states[0].typ = validationTypeGroup
|
||||||
states[0].endGroup = groupTag
|
states[0].endGroup = groupTag
|
||||||
}
|
}
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, ValidationInvalid
|
||||||
|
}
|
||||||
initialized := true
|
initialized := true
|
||||||
start := len(b)
|
start := len(b)
|
||||||
State:
|
State:
|
||||||
@@ -451,6 +458,13 @@ State:
|
|||||||
mi: vi.mi,
|
mi: vi.mi,
|
||||||
tail: b,
|
tail: b,
|
||||||
})
|
})
|
||||||
|
if vi.typ == validationTypeMessage ||
|
||||||
|
vi.typ == validationTypeGroup ||
|
||||||
|
vi.typ == validationTypeMap {
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, ValidationInvalid
|
||||||
|
}
|
||||||
|
}
|
||||||
b = v
|
b = v
|
||||||
continue State
|
continue State
|
||||||
case validationTypeRepeatedVarint:
|
case validationTypeRepeatedVarint:
|
||||||
@@ -499,6 +513,9 @@ State:
|
|||||||
mi: vi.mi,
|
mi: vi.mi,
|
||||||
endGroup: num,
|
endGroup: num,
|
||||||
})
|
})
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, ValidationInvalid
|
||||||
|
}
|
||||||
continue State
|
continue State
|
||||||
case flags.ProtoLegacy && vi.typ == validationTypeMessageSetItem:
|
case flags.ProtoLegacy && vi.typ == validationTypeMessageSetItem:
|
||||||
typeid, v, n, err := messageset.ConsumeFieldValue(b, false)
|
typeid, v, n, err := messageset.ConsumeFieldValue(b, false)
|
||||||
@@ -521,6 +538,13 @@ State:
|
|||||||
mi: xvi.mi,
|
mi: xvi.mi,
|
||||||
tail: b[n:],
|
tail: b[n:],
|
||||||
})
|
})
|
||||||
|
if xvi.typ == validationTypeMessage ||
|
||||||
|
xvi.typ == validationTypeGroup ||
|
||||||
|
xvi.typ == validationTypeMap {
|
||||||
|
if opts.depth--; opts.depth < 0 {
|
||||||
|
return out, ValidationInvalid
|
||||||
|
}
|
||||||
|
}
|
||||||
b = v
|
b = v
|
||||||
continue State
|
continue State
|
||||||
}
|
}
|
||||||
@@ -547,12 +571,14 @@ State:
|
|||||||
switch st.typ {
|
switch st.typ {
|
||||||
case validationTypeMessage, validationTypeGroup:
|
case validationTypeMessage, validationTypeGroup:
|
||||||
numRequiredFields = int(st.mi.numRequiredFields)
|
numRequiredFields = int(st.mi.numRequiredFields)
|
||||||
|
opts.depth++
|
||||||
case validationTypeMap:
|
case validationTypeMap:
|
||||||
// If this is a map field with a message value that contains
|
// If this is a map field with a message value that contains
|
||||||
// required fields, require that the value be present.
|
// required fields, require that the value be present.
|
||||||
if st.mi != nil && st.mi.numRequiredFields > 0 {
|
if st.mi != nil && st.mi.numRequiredFields > 0 {
|
||||||
numRequiredFields = 1
|
numRequiredFields = 1
|
||||||
}
|
}
|
||||||
|
opts.depth++
|
||||||
}
|
}
|
||||||
// If there are more than 64 required fields, this check will
|
// If there are more than 64 required fields, this check will
|
||||||
// always fail and we will report that the message is potentially
|
// always fail and we will report that the message is potentially
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ import (
|
|||||||
const (
|
const (
|
||||||
Major = 1
|
Major = 1
|
||||||
Minor = 36
|
Minor = 36
|
||||||
Patch = 10
|
Patch = 11
|
||||||
PreRelease = ""
|
PreRelease = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+7
-3
@@ -121,9 +121,8 @@ func (o UnmarshalOptions) unmarshal(b []byte, m protoreflect.Message) (out proto
|
|||||||
|
|
||||||
out, err = methods.Unmarshal(in)
|
out, err = methods.Unmarshal(in)
|
||||||
} else {
|
} else {
|
||||||
o.RecursionLimit--
|
if o.RecursionLimit--; o.RecursionLimit < 0 {
|
||||||
if o.RecursionLimit < 0 {
|
return out, errRecursionDepth
|
||||||
return out, errors.New("exceeded max recursion depth")
|
|
||||||
}
|
}
|
||||||
err = o.unmarshalMessageSlow(b, m)
|
err = o.unmarshalMessageSlow(b, m)
|
||||||
}
|
}
|
||||||
@@ -220,6 +219,9 @@ func (o UnmarshalOptions) unmarshalSingular(b []byte, wtyp protowire.Type, m pro
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv protoreflect.Map, fd protoreflect.FieldDescriptor) (n int, err error) {
|
func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv protoreflect.Map, fd protoreflect.FieldDescriptor) (n int, err error) {
|
||||||
|
if o.RecursionLimit--; o.RecursionLimit < 0 {
|
||||||
|
return 0, errRecursionDepth
|
||||||
|
}
|
||||||
if wtyp != protowire.BytesType {
|
if wtyp != protowire.BytesType {
|
||||||
return 0, errUnknown
|
return 0, errUnknown
|
||||||
}
|
}
|
||||||
@@ -305,3 +307,5 @@ func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv proto
|
|||||||
var errUnknown = errors.New("BUG: internal error (unknown)")
|
var errUnknown = errors.New("BUG: internal error (unknown)")
|
||||||
|
|
||||||
var errDecode = errors.New("cannot parse invalid wire-format data")
|
var errDecode = errors.New("cannot parse invalid wire-format data")
|
||||||
|
|
||||||
|
var errRecursionDepth = errors.New("exceeded maximum recursion depth")
|
||||||
|
|||||||
Vendored
+1
-1
@@ -114,7 +114,7 @@ golang.org/x/net/bpf
|
|||||||
## explicit; go 1.24.0
|
## explicit; go 1.24.0
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# google.golang.org/protobuf v1.36.10
|
# google.golang.org/protobuf v1.36.11
|
||||||
## explicit; go 1.23
|
## explicit; go 1.23
|
||||||
google.golang.org/protobuf/encoding/prototext
|
google.golang.org/protobuf/encoding/prototext
|
||||||
google.golang.org/protobuf/encoding/protowire
|
google.golang.org/protobuf/encoding/protowire
|
||||||
|
|||||||
Reference in New Issue
Block a user