diff options
author | Keegan Carruthers-Smith <keegan.csmith@gmail.com> | 2019-05-07 15:49:56 +0200 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-05-22 04:43:25 +0000 |
commit | 648c7b592a30b2280e8d23419224c657ab0a8332 (patch) | |
tree | 33a0d58ecaa32baf2da745d35c3fd4974defd91c /src/regexp | |
parent | 24b43013a12ed8bab9adcce5b8265b1fb87ff506 (diff) | |
download | go-648c7b592a30b2280e8d23419224c657ab0a8332.tar.gz go-648c7b592a30b2280e8d23419224c657ab0a8332.zip |
regexp/syntax: exclude full range from String negation case
If the char class is 0x0-0x10ffff we mistakenly would String that to `[^]`,
which is not a valid regex.
Fixes #31807
Change-Id: I9ceeaddc28b67b8e1de12b6703bcb124cc784556
Reviewed-on: https://go-review.googlesource.com/c/go/+/175679
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/regexp')
-rw-r--r-- | src/regexp/syntax/parse_test.go | 1 | ||||
-rw-r--r-- | src/regexp/syntax/regexp.go | 2 |
2 files changed, 2 insertions, 1 deletions
diff --git a/src/regexp/syntax/parse_test.go b/src/regexp/syntax/parse_test.go index fe3d251761..5581ba1ca5 100644 --- a/src/regexp/syntax/parse_test.go +++ b/src/regexp/syntax/parse_test.go @@ -185,6 +185,7 @@ var parseTests = []parseTest{ {`(?-s).`, `dnl{}`}, {`(?:(?:^).)`, `cat{bol{}dot{}}`}, {`(?-s)(?:(?:^).)`, `cat{bol{}dnl{}}`}, + {`[\s\S]a`, `cat{cc{0x0-0x10ffff}lit{a}}`}, // RE2 prefix_tests {`abc|abd`, `cat{str{ab}cc{0x63-0x64}}`}, diff --git a/src/regexp/syntax/regexp.go b/src/regexp/syntax/regexp.go index ae5fa053f9..3a4d2d201c 100644 --- a/src/regexp/syntax/regexp.go +++ b/src/regexp/syntax/regexp.go @@ -139,7 +139,7 @@ func writeRegexp(b *strings.Builder, re *Regexp) { b.WriteRune('[') if len(re.Rune) == 0 { b.WriteString(`^\x00-\x{10FFFF}`) - } else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune { + } else if re.Rune[0] == 0 && re.Rune[len(re.Rune)-1] == unicode.MaxRune && len(re.Rune) > 2 { // Contains 0 and MaxRune. Probably a negated class. // Print the gaps. b.WriteRune('^') |