Skip to content

Commit d31670a

Browse files
authored
Add backtrack protection to 3.x release (#321)
1 parent 6d2e8db commit d31670a

File tree

3 files changed

+2358
-1564
lines changed

3 files changed

+2358
-1564
lines changed

index.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ function parse (str, options) {
9090
var optional = modifier === '?' || modifier === '*'
9191
var pattern = capture || group
9292
var delimiter = prev || defaultDelimiter
93+
var prevText = prev || (typeof tokens[tokens.length - 1] === 'string' ? tokens[tokens.length - 1] : '')
9394

9495
tokens.push({
9596
name: name || key++,
@@ -99,7 +100,7 @@ function parse (str, options) {
99100
repeat: repeat,
100101
pattern: pattern
101102
? escapeGroup(pattern)
102-
: '[^' + escapeString(delimiter === defaultDelimiter ? delimiter : (delimiter + defaultDelimiter)) + ']+?'
103+
: restrictBacktrack(delimiter, defaultDelimiter, prevText)
103104
})
104105
}
105106

@@ -111,6 +112,16 @@ function parse (str, options) {
111112
return tokens
112113
}
113114

115+
function restrictBacktrack (delimiter, defaultDelimiter, prevText) {
116+
var charGroup = '[^' + escapeString(delimiter === defaultDelimiter ? delimiter : (delimiter + defaultDelimiter)) + ']'
117+
118+
if (!prevText || prevText.indexOf(delimiter) > -1 || prevText.indexOf(defaultDelimiter) > -1) {
119+
return charGroup + '+?'
120+
}
121+
122+
return escapeString(prevText) + '|(?:(?!' + escapeString(prevText) + ')' + charGroup + ')+?'
123+
}
124+
114125
/**
115126
* Compile a string to a template function for the path.
116127
*

0 commit comments

Comments
 (0)