From 2e05c777ac5a4279500ba815ae0e8f8ace17eba5 Mon Sep 17 00:00:00 2001 From: Jamie Davis Date: Sat, 2 Jun 2018 01:17:38 -0400 Subject: [PATCH] address review comments --- lib/marked.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/marked.js b/lib/marked.js index 50a6afa8a5..87c27a68bf 100644 --- a/lib/marked.js +++ b/lib/marked.js @@ -1355,36 +1355,36 @@ function splitCells(tableRow, count) { return cells; } -// Return str with all trailing {c | all but c} removed -// allButC: Default false -function rtrim(str, c, allButC) { - if (typeof allButC === 'undefined') { - allButC = false; +// Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). +// /c*$/ is vulnerable to REDOS. +// invert: Remove suffix of non-c chars instead. Default false. +function rtrim(str, c, invert) { + if (typeof invert === 'undefined' || !invert) { + invert = false; } else { - allButC = true; + invert = true; } - var mustMatchC = !allButC; if (str.length === 0) { return ''; } - // ix+1 of leftmost that fits description - // i.e. the length of the string we should return - var curr = str.length; + // Length of suffix matching the invert condition. + var suffLen = 0; - while (curr > 0) { - var currChar = str.charAt(curr - 1); - if (mustMatchC && currChar === c) { - curr--; - } else if (!mustMatchC && currChar !== c) { - curr--; + // Step left until we fail to match the invert condition. + while (suffLen < str.length) { + var currChar = str.charAt(str.length - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; } else { break; } } - return str.substr(0, curr); + return str.substr(0, str.length - suffLen); } /**