diff options
Diffstat (limited to 'vendor/google.golang.org/protobuf/internal/encoding/text/decode.go')
| -rw-r--r-- | vendor/google.golang.org/protobuf/internal/encoding/text/decode.go | 30 | 
1 files changed, 25 insertions, 5 deletions
diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go index 37803773f..427c62d03 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go @@ -8,7 +8,6 @@ import (  	"bytes"  	"fmt"  	"io" -	"regexp"  	"strconv"  	"unicode/utf8" @@ -421,7 +420,7 @@ func (d *Decoder) parseFieldName() (tok Token, err error) {  		return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size])  	} -	return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(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 @@ -571,7 +570,7 @@ func (d *Decoder) parseScalar() (Token, error) {  		return tok, nil  	} -	return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in)) +	return Token{}, d.newSyntaxError("invalid scalar value: %s", errId(d.in))  }  // parseLiteralValue parses a literal value. A literal value is used for @@ -653,8 +652,29 @@ func consume(b []byte, n int) []byte {  	return b  } -// Any sequence that looks like a non-delimiter (for error reporting). -var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`) +// errId extracts a byte sequence that looks like an invalid ID +// (for the purposes of error reporting). +func errId(seq []byte) []byte { +	const maxLen = 32 +	for i := 0; i < len(seq); { +		if i > maxLen { +			return append(seq[:i:i], "…"...) +		} +		r, size := utf8.DecodeRune(seq[i:]) +		if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) { +			if i == 0 { +				// Either the first byte is invalid UTF-8 or a +				// delimiter, or the first rune is non-ASCII. +				// Return it as-is. +				i = size +			} +			return seq[:i:i] +		} +		i += size +	} +	// No delimiter found. +	return seq +}  // isDelim returns true if given byte is a delimiter character.  func isDelim(c byte) bool {  | 
