aboutsummaryrefslogtreecommitdiff
path: root/src/regexp
diff options
context:
space:
mode:
authorKeegan Carruthers-Smith <keegan.csmith@gmail.com>2019-05-07 15:49:56 +0200
committerBrad Fitzpatrick <bradfitz@golang.org>2019-05-22 04:43:25 +0000
commit648c7b592a30b2280e8d23419224c657ab0a8332 (patch)
tree33a0d58ecaa32baf2da745d35c3fd4974defd91c /src/regexp
parent24b43013a12ed8bab9adcce5b8265b1fb87ff506 (diff)
downloadgo-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.go1
-rw-r--r--src/regexp/syntax/regexp.go2
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('^')