mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
fix(no_control_regex) fix panic on multi-byte regex chars
authored by @camc314 closes #934 closes #935
This commit is contained in:
parent
266253c142
commit
2440ec712f
1 changed files with 10 additions and 2 deletions
|
|
@ -71,6 +71,7 @@ impl Rule for NoControlRegex {
|
|||
fn run<'a>(&self, node: &AstNode<'a>, context: &LintContext<'a>) {
|
||||
if let Some(RegexPatternData { pattern, flags, span }) = regex_pattern(node) {
|
||||
let mut violations: Vec<&str> = Vec::new();
|
||||
|
||||
for matched_ctl_pattern in control_patterns(pattern) {
|
||||
let ctl = matched_ctl_pattern.as_str();
|
||||
|
||||
|
|
@ -79,12 +80,16 @@ impl Rule for NoControlRegex {
|
|||
if ctl.starts_with('\\') && matched_ctl_pattern.start() > 0 {
|
||||
let pattern_chars: Vec<char> = pattern.chars().collect(); // ew
|
||||
|
||||
let mut first_backslash = matched_ctl_pattern.start();
|
||||
// Convert byte index to char index
|
||||
let byte_start = matched_ctl_pattern.start();
|
||||
let char_start = pattern[..byte_start].chars().count();
|
||||
|
||||
let mut first_backslash = char_start;
|
||||
while first_backslash > 0 && pattern_chars[first_backslash] == '\\' {
|
||||
first_backslash -= 1;
|
||||
}
|
||||
|
||||
let mut num_slashes = matched_ctl_pattern.start() - first_backslash;
|
||||
let mut num_slashes = char_start - first_backslash;
|
||||
if first_backslash == 0 && pattern_chars[first_backslash] == '\\' {
|
||||
num_slashes += 1;
|
||||
}
|
||||
|
|
@ -283,6 +288,8 @@ mod tests {
|
|||
vec![
|
||||
r"u00", // not a control sequence
|
||||
r"\u00ff", // in valid range
|
||||
// multi byte unicode ctl
|
||||
r"var re = /^([a-zªµºß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķ-ĸĺļľŀłńņň-ʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżž-ƀƃƅƈƌ-ƍƒƕƙ-ƛƞơƣƥƨƪ-ƫƭưƴƶƹ-ƺƽ-ƿdžljnjǎǐǒǔǖǘǚǜ-ǝǟǡǣǥǧǩǫǭǯ-ǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳ-ȹȼȿ-ɀɂɇɉɋɍɏ-ʓʕ-ʯͱͳͷͻ-ͽΐά-ώϐ-ϑϕ-ϗϙϛϝϟϡϣϥϧϩϫϭϯ-ϳϵϸϻ-ϼа-џѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎ-ӏӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹӻӽӿԁԃԅԇԉԋԍԏԑԓԕԗԙԛԝԟԡԣա-ևᴀ-ᴫᵢ-ᵷᵹ-ᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕ-ẝẟạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹỻỽỿ-ἇἐ-ἕἠ-ἧἰ-ἷὀ-ὅὐ-ὗὠ-ὧὰ-ώᾀ-ᾇᾐ-ᾗᾠ-ᾧᾰ-ᾴᾶ-ᾷιῂ-ῄῆ-ῇῐ-ΐῖ-ῗῠ-ῧῲ-ῴῶ-ῷⁱⁿℊℎ-ℏℓℯℴℹℼ-ℽⅆ-ⅉⅎↄⰰ-ⱞⱡⱥ-ⱦⱨⱪⱬⱱⱳ-ⱴⱶ-ⱼⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣ-ⳤⴀ-ⴥꙁꙃꙅꙇꙉꙋꙍꙏꙑꙓꙕꙗꙙꙛꙝꙟꙣꙥꙧꙩꙫꙭꚁꚃꚅꚇꚉꚋꚍꚏꚑꚓꚕꚗꜣꜥꜧꜩꜫꜭꜯ-ꜱꜳꜵꜷꜹꜻꜽꜿꝁꝃꝅꝇꝉꝋꝍꝏꝑꝓꝕꝗꝙꝛꝝꝟꝡꝣꝥꝧꝩꝫꝭꝯꝱ-ꝸꝺꝼꝿꞁꞃꞅꞇꞌff-stﬓ-ﬗa-z]|\ud801[\udc28-\udc4f]|\ud835[\udc1a-\udc33\udc4e-\udc54\udc56-\udc67\udc82-\udc9b\udcb6-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udccf\udcea-\udd03\udd1e-\udd37\udd52-\udd6b\udd86-\udd9f\uddba-\uddd3\uddee-\ude07\ude22-\ude3b\ude56-\ude6f\ude8a-\udea5\udec2-\udeda\udedc-\udee1\udefc-\udf14\udf16-\udf1b\udf36-\udf4e\udf50-\udf55\udf70-\udf88\udf8a-\udf8f\udfaa-\udfc2\udfc4-\udfc9\udfcb])$/;",
|
||||
],
|
||||
vec![
|
||||
// regex literal
|
||||
|
|
@ -300,6 +307,7 @@ mod tests {
|
|||
r"let r = new RegExp('\\u000c');",
|
||||
r"let r = new RegExp('\\u000C');",
|
||||
r"let r = new RegExp('\\u001f');",
|
||||
|
||||
],
|
||||
)
|
||||
.test();
|
||||
|
|
|
|||
Loading…
Reference in a new issue