From f9ec075e88b508653e87742851224752fbeeef19 Mon Sep 17 00:00:00 2001 From: Stefan Farfeleder 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; } }