From 648c7b592a30b2280e8d23419224c657ab0a8332 Mon Sep 17 00:00:00 2001 From: Keegan Carruthers-Smith Date: Tue, 7 May 2019 15:49:56 +0200 Subject: [PATCH] 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 --- src/regexp/syntax/parse_test.go | 1 + src/regexp/syntax/regexp.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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('^') -- 2.48.1