Skip to content

Commit 9aa8bce

Browse files
committed
resolve issue with trailing escaped commas in scriptlet arguments
Discovered from `pravda.com.ua,epravda.com.ua##+js(remove-node-text, script, \,mr=function(r\,)` in Adguard Russian
1 parent dd970f2 commit 9aa8bce

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

src/resources/resource_storage.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,13 @@ fn index_next_unescaped_separator(s: &str, separator: char) -> (Option<usize>, b
350350
return (None, needs_transform)
351351
}
352352
}
353-
(Some(new_arg_end), needs_transform)
353+
// don't index beyond the end of the string
354+
let new_arg_end = if new_arg_end >= s.len() {
355+
None
356+
} else {
357+
Some(new_arg_end)
358+
};
359+
(new_arg_end, needs_transform)
354360
}
355361

356362
/// Replaces escaped instances of `separator` in `arg` with unescaped characters.
@@ -467,6 +473,8 @@ mod arg_parsing_util_tests {
467473
assert_eq!(index_next_unescaped_separator(r#"\`\\\``"#, '`'), (Some(6), true));
468474
assert_eq!(index_next_unescaped_separator(r#"\\\`\``"#, '`'), (Some(6), true));
469475
assert_eq!(index_next_unescaped_separator(r#"\\\`\\``"#, '`'), (Some(6), true));
476+
477+
assert_eq!(index_next_unescaped_separator(r#"\,test\,"#, ','), (None, true))
470478
}
471479

472480
#[test]
@@ -615,6 +623,12 @@ mod scriptlet_storage_tests {
615623
assert_eq!(args, None);
616624
}
617625

626+
#[test]
627+
fn parse_argslist_trailing_escaped_comma() {
628+
let args = parse_scriptlet_args(r#"remove-node-text, script, \,mr=function(r\,"#).unwrap();
629+
assert_eq!(args, vec!["remove-node-text", "script", ",mr=function(r,"]);
630+
}
631+
618632
#[test]
619633
fn get_patched_scriptlets() {
620634
let resources = ResourceStorage::from_resources([

0 commit comments

Comments
 (0)