Skip to content

Commit 7d27d66

Browse files
committed
fix(security): mitigate ReDoS in compile-dots.js by avoiding regex match on tainted code
1 parent e3af0a7 commit 7d27d66

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

scripts/compile-dots.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var FUNCTION_NAME = /function\s+anonymous\s*\(it[^)]*\)\s*{/;
2828
var OUT_EMPTY_STRING = /out\s*\+=\s*'\s*';/g;
2929
var ISTANBUL = /'(istanbul[^']+)';/g;
3030
var ERROR_KEYWORD = /\$errorKeyword/g;
31+
var ERROR_KEYWORD_STR = ERROR_KEYWORD.source.replace(/^\\\\/, '');
3132
var ERROR_KEYWORD_OR = /\$errorKeyword\s+\|\|/g;
3233
var VARS = [
3334
'$errs', '$valid', '$lvl', '$data', '$dataLvl',
@@ -52,22 +53,22 @@ files.forEach(function (f) {
5253
console.log('compiled', keyword);
5354

5455
function removeUnusedVar(v) {
55-
v = v.replace(/\$/g, '\\$$');
56-
var regexp = new RegExp(v + '[^A-Za-z0-9_$]', 'g');
57-
var count = occurrences(regexp);
56+
var count = 0, idx = 0;
57+
while ((idx = code.indexOf(v, idx)) !== -1) {
58+
if (idx + v.length >= code.length || !/[A-Za-z0-9_$]/.test(code[idx + v.length])) count++;
59+
idx += 1;
60+
}
5861
if (count == 1) {
59-
regexp = new RegExp('var\\s+' + v + '\\s*=[^;]+;|var\\s+' + v + ';');
62+
var vEsc = v.replace(/\$/g, '\\$$');
63+
var regexp = new RegExp('var\\s+' + vEsc + '\\s*=[^;]*?;|var\\s+' + vEsc + ';');
6064
code = code.replace(regexp, '');
6165
}
6266
}
6367

6468
function removeAlwaysFalsyInOr() {
65-
var countUsed = occurrences(ERROR_KEYWORD);
66-
var countOr = occurrences(ERROR_KEYWORD_OR);
69+
var countUsed = code.split(ERROR_KEYWORD_STR).length - 1;
70+
var countOr = 0, idx = 0;
71+
while ((idx = code.indexOf(ERROR_KEYWORD_STR + ' ||', idx)) !== -1) { countOr++; idx += 1; }
6772
if (countUsed == countOr + 1) code = code.replace(ERROR_KEYWORD_OR, '');
6873
}
69-
70-
function occurrences(regexp) {
71-
return (code.match(regexp) || []).length;
72-
}
7374
});

0 commit comments

Comments
 (0)