Skip to content

Commit 925ac8e

Browse files
authored
Add backtrack protection to 1.x release (#320)
1 parent 32a14b0 commit 925ac8e

File tree

5 files changed

+4250
-36
lines changed

5 files changed

+4250
-36
lines changed

index.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ function parse (str, options) {
7272
var partial = prefix != null && next != null && next !== prefix
7373
var repeat = modifier === '+' || modifier === '*'
7474
var optional = modifier === '?' || modifier === '*'
75-
var delimiter = res[2] || defaultDelimiter
75+
var delimiter = prefix || defaultDelimiter
7676
var pattern = capture || group
77+
var prevText = prefix || (typeof tokens[tokens.length - 1] === 'string' ? tokens[tokens.length - 1] : '')
7778

7879
tokens.push({
7980
name: name || key++,
@@ -83,7 +84,7 @@ function parse (str, options) {
8384
repeat: repeat,
8485
partial: partial,
8586
asterisk: !!asterisk,
86-
pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
87+
pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : restrictBacktrack(delimiter, prevText))
8788
})
8889
}
8990

@@ -100,6 +101,14 @@ function parse (str, options) {
100101
return tokens
101102
}
102103

104+
function restrictBacktrack(delimiter, prevText) {
105+
if (!prevText || prevText.indexOf(delimiter) > -1) {
106+
return '[^' + escapeString(delimiter) + ']+?'
107+
}
108+
109+
return escapeString(prevText) + '|(?:(?!' + escapeString(prevText) + ')[^' + escapeString(delimiter) + '])+?'
110+
}
111+
103112
/**
104113
* Compile a string to a template function for the path.
105114
*

0 commit comments

Comments
 (0)