# New Ticket Created by Dan Collins # Please include the string: [perl #129336] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/Ticket/Display.html?id=129336 > Hello, There is a bug in argument parsing of the -i flag. Perl_moreswitches processes a single switch, and returns a pointer to the start of the next switch. It can return either the a pointer to the next flag itself: #!perl -n -p ^ Can point here Or, to the space before the next "arg": #!perl -n -p ^ Can point here (Where the next call to Perl_moreswitches will consume " -".) In the case of -i[extension], the pointer is by default pointing at the space after the end of the argument. The current code tries to do the former, by unconditionally advancing the pointer, and then advancing it again if it is on a '-'. But that is incorrect: #!perl -i p ^ Will point here, but that isn't a flag This is a problem if -i is the last argument before either a file name, or a malformed argument. This normally isn't a problem on the command line because Perl_moreswitches operates on elements of `argv` one at a time. However, someone who typed `perl "-ifoo Vbar.pl"` into bash, or someone who has a messed up #! line, will encounter this. I could fix this by removing the unconditional s++, and having it increment by 2 if *(s+1)=='-', but this work isn't actually necessary - it's better to just remove the special-casing for -i and leave it pointing at the space after the argument. Found with AFL, believe it or not. This is not a regression, and all tests pass for me. I've added a test for this, it basically makes sure that `#!perl -i u` does /not/ crash. Clicking submit so I get an RT number. -- Respectfully, Dan CollinsThread Previous