@@ -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