diff options
author | Dan Collins <dcollinsn@gmail.com> | 2016-09-23 01:21:20 -0400 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2016-10-11 11:41:15 +1100 |
commit | f54cfdacff1f3744ef08fc70f1f3bc6c7d862e83 (patch) | |
tree | 558deaa940fb8515c8f9bf7778a45f6ac13ddda4 /perl.c | |
parent | 91dca83e9396e920f65b4f093ac7f6e5250a2f43 (diff) | |
download | perl-f54cfdacff1f3744ef08fc70f1f3bc6c7d862e83.tar.gz |
[rt #129336] #!perl -i u erroneously interpreted as -u
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
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 leave it pointing at the space after
the argument.
Diffstat (limited to 'perl.c')
-rw-r--r-- | perl.c | 5 |
1 files changed, 0 insertions, 5 deletions
@@ -3349,11 +3349,6 @@ Perl_moreswitches(pTHX_ const char *s) PL_inplace = savepvn(start, s - start); } - if (*s) { - ++s; - if (*s == '-') /* Additional switches on #! line. */ - s++; - } return s; case 'I': /* -I handled both here and in parse_body() */ forbid_setid('I', FALSE); |