ash: fix "shift BIGNUM" and "read with no variable name" bugs.
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 18 Jun 2008 19:22:19 +0000 (19:22 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 18 Jun 2008 19:22:19 +0000 (19:22 -0000)
 omg. hush testsuite helps to find bugs in ash! what next?

function                                             old     new   delta
static.arg_REPLY                                       -       8      +8
readcmd                                             1023    1021      -2
shiftcmd                                             129     125      -4
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 8/-6)                Total: 2 bytes

shell/ash.c

index b490b69..f8e4e7d 100644 (file)
@@ -9549,7 +9549,7 @@ shiftcmd(int argc ATTRIBUTE_UNUSED, char **argv)
        if (argv[1])
                n = number(argv[1]);
        if (n > shellparam.nparam)
-               ash_msg_and_raise_error("can't shift that many");
+               n = shellparam.nparam;
        INT_OFF;
        shellparam.nparam -= n;
        for (ap1 = shellparam.p; --n >= 0; ap1++) {
@@ -11994,6 +11994,8 @@ typedef enum __rlimit_resource rlim_t;
 static int
 readcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
 {
+       static const char *const arg_REPLY[] = { "REPLY", NULL };
+
        char **ap;
        int backslash;
        char c;
@@ -12086,7 +12088,7 @@ readcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
        }
        ap = argptr;
        if (*ap == NULL)
-               ash_msg_and_raise_error("arg count");
+               ap = (char**)arg_REPLY;
        ifs = bltinlookup("IFS");
        if (ifs == NULL)
                ifs = defifs;