ash: exec: Never rehash regular built-ins
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Feb 2020 15:20:05 +0000 (16:20 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Feb 2020 15:20:05 +0000 (16:20 +0100)
Upstream commit:

    Date: Sat, 19 May 2018 02:39:51 +0800
    exec: Never rehash regular built-ins

    As regular (including special) built-ins can never be overridden,
    we should never remove them from the hash table.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index c383cccda6a682e803f2bfee11268f622ee61088..389db3cd0290b8cb437ba4653f88d9dc45ce4a4f 100644 (file)
@@ -8284,7 +8284,10 @@ clearcmdentry(void)
                pp = tblp;
                while ((cmdp = *pp) != NULL) {
                        if (cmdp->cmdtype == CMDNORMAL
-                        || (cmdp->cmdtype == CMDBUILTIN && builtinloc > 0)
+                        || (cmdp->cmdtype == CMDBUILTIN
+                           && !IS_BUILTIN_REGULAR(cmdp->param.cmd)
+                           && builtinloc > 0
+                           )
                        ) {
                                *pp = cmdp->next;
                                free(cmdp);
@@ -8403,7 +8406,11 @@ hashcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                cmdp = cmdlookup(name, 0);
                if (cmdp != NULL
                 && (cmdp->cmdtype == CMDNORMAL
-                    || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0))
+                   || (cmdp->cmdtype == CMDBUILTIN
+                       && !IS_BUILTIN_REGULAR(cmdp->param.cmd)
+                       && builtinloc > 0
+                       )
+                   )
                ) {
                        delete_cmd_entry();
                }
@@ -13556,7 +13563,7 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
                        bit = DO_NOFUNC;
                        break;
                case CMDBUILTIN:
-                       bit = DO_ALTBLTIN;
+                       bit = IS_BUILTIN_REGULAR(cmdp->param.cmd) ? 0 : DO_ALTBLTIN;
                        break;
                }
                if (act & bit) {