From d52b1cf43ee9e8d06f32d2bd3eb47d345b42e0ff Mon Sep 17 00:00:00 2001 From: stefanf Date: Sat, 22 Mar 2008 14:06:01 +0000 Subject: [PATCH] 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 --- bin/sh/options.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/sh/options.c b/bin/sh/options.c index 58c5c7bbc2d7..ff5736d31b94 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; } }