diff options
author | stefanf <stefanf@FreeBSD.org> | 2008-03-22 14:06:01 +0000 |
---|---|---|
committer | stefanf <stefanf@FreeBSD.org> | 2008-03-22 14:06:01 +0000 |
commit | d52b1cf43ee9e8d06f32d2bd3eb47d345b42e0ff (patch) | |
tree | 852cb926560b98ec887858eb301752feb0b6b02a /bin | |
parent | 89b08d11a7a3b73300a21c74f2bfb12da246303c (diff) | |
download | FreeBSD-src-d52b1cf43ee9e8d06f32d2bd3eb47d345b42e0ff.zip FreeBSD-src-d52b1cf43ee9e8d06f32d2bd3eb47d345b42e0ff.tar.gz |
Reset the internal state used for the 'getopts' built-in when 'shift' or 'set'
are used to modify the arguments. Not doing so caused random memory reads or
null pointer dereferences when 'getopts' was called again later (SUSv3 says
getopts produces unspecified results in this case).
PR: 48318
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/options.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/bin/sh/options.c b/bin/sh/options.c index 58c5c7b..ff5736d 100644 --- a/bin/sh/options.c +++ b/bin/sh/options.c @@ -383,7 +383,7 @@ shiftcmd(int argc, char **argv) } ap2 = shellparam.p; while ((*ap2++ = *ap1++) != NULL); - shellparam.optnext = NULL; + shellparam.reset = 1; INTON; return 0; } @@ -405,6 +405,7 @@ setcmd(int argc, char **argv) if (*argptr != NULL) { setparam(argptr); } + shellparam.reset = 1; INTON; return 0; } @@ -414,7 +415,6 @@ void getoptsreset(const char *value) { if (number(value) == 1) { - shellparam.optnext = NULL; shellparam.reset = 1; } } |