Skip to content

Commit af2ceb9

Browse files
committed
Fallback to regexp2 if repeat count is too large. Fixes #681
1 parent 7516b81 commit af2ceb9

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

builtin_regexp.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package goja
22

33
import (
4+
"errors"
45
"fmt"
56
"regexp"
7+
"regexp/syntax"
68
"strings"
79
"unicode/utf16"
810
"unicode/utf8"
@@ -242,8 +244,8 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
242244
patternStr = convertRegexpToUtf16(patternStr)
243245
}
244246

245-
re2Str, err1 := parser.TransformRegExp(patternStr, dotAll, unicode)
246-
if err1 == nil {
247+
re2Str, err := parser.TransformRegExp(patternStr, dotAll, unicode)
248+
if err == nil {
247249
re2flags := ""
248250
if multiline {
249251
re2flags += "m"
@@ -260,15 +262,22 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) {
260262

261263
pattern, err1 := regexp.Compile(re2Str)
262264
if err1 != nil {
263-
err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1)
264-
return
265+
var syntaxError *syntax.Error
266+
if !errors.As(err1, &syntaxError) || syntaxError.Code != syntax.ErrInvalidRepeatSize {
267+
err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1)
268+
return
269+
}
270+
} else {
271+
wrapper = (*regexpWrapper)(pattern)
265272
}
266-
wrapper = (*regexpWrapper)(pattern)
267273
} else {
268-
if _, incompat := err1.(parser.RegexpErrorIncompatible); !incompat {
269-
err = err1
274+
var incompat parser.RegexpErrorIncompatible
275+
if !errors.As(err, &incompat) {
270276
return
271277
}
278+
}
279+
280+
if wrapper == nil {
272281
wrapper2, err = compileRegexp2(patternStr, multiline, dotAll, ignoreCase, unicode)
273282
if err != nil {
274283
err = fmt.Errorf("Invalid regular expression (regexp2): %s (%v)", patternStr, err)

regexp_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,14 @@ func TestRegExpLastIndex(t *testing.T) {
779779
testScriptWithTestLib(SCRIPT, _undefined, t)
780780
}
781781

782+
func TestRegExpRepeatCount(t *testing.T) {
783+
const SCRIPT = `
784+
const re = /^0x[0-9a-fA-F]{0,4096}$/;
785+
re.test("0xABCD");
786+
`
787+
testScript(SCRIPT, valueTrue, t)
788+
}
789+
782790
func BenchmarkRegexpSplitWithBackRef(b *testing.B) {
783791
const SCRIPT = `
784792
"aaaaaaaaaaaaaaaaaaaaaaaaa++bbbbbbbbbbbbbbbbbbbbbb+-ccccccccccccccccccccccc".split(/([+-])\1/)

0 commit comments

Comments
 (0)