@@ -350,7 +350,13 @@ fn index_next_unescaped_separator(s: &str, separator: char) -> (Option<usize>, b
350
350
return ( None , needs_transform)
351
351
}
352
352
}
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)
354
360
}
355
361
356
362
/// Replaces escaped instances of `separator` in `arg` with unescaped characters.
@@ -467,6 +473,8 @@ mod arg_parsing_util_tests {
467
473
assert_eq ! ( index_next_unescaped_separator( r#"\`\\\``"# , '`' ) , ( Some ( 6 ) , true ) ) ;
468
474
assert_eq ! ( index_next_unescaped_separator( r#"\\\`\``"# , '`' ) , ( Some ( 6 ) , true ) ) ;
469
475
assert_eq ! ( index_next_unescaped_separator( r#"\\\`\\``"# , '`' ) , ( Some ( 6 ) , true ) ) ;
476
+
477
+ assert_eq ! ( index_next_unescaped_separator( r#"\,test\,"# , ',' ) , ( None , true ) )
470
478
}
471
479
472
480
#[ test]
@@ -615,6 +623,12 @@ mod scriptlet_storage_tests {
615
623
assert_eq ! ( args, None ) ;
616
624
}
617
625
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
+
618
632
#[ test]
619
633
fn get_patched_scriptlets ( ) {
620
634
let resources = ResourceStorage :: from_resources ( [
0 commit comments