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

Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>
---

 src/exec.c |   15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/exec.c b/src/exec.c
index 8948754..6c0a64f 100644
--- a/src/exec.c
+++ b/src/exec.c
@@ -287,9 +287,11 @@ hashcmd(int argc, char **argv)
        }
        c = 0;
        while ((name = *argptr) != NULL) {
-               if ((cmdp = cmdlookup(name, 0)) != NULL
-                && (cmdp->cmdtype == CMDNORMAL
-                    || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)))
+               if ((cmdp = cmdlookup(name, 0)) &&
+                   (cmdp->cmdtype == CMDNORMAL ||
+                    (cmdp->cmdtype == CMDBUILTIN &&
+                     !(cmdp->param.cmd->flags & BUILTIN_REGULAR) &&
+                     builtinloc > 0)))
                        delete_cmd_entry();
                find_command(name, &entry, DO_ERR, pathval());
                if (entry.cmdtype == CMDUNKNOWN)
@@ -377,7 +379,8 @@ find_command(char *name, struct cmdentry *entry, int act, 
const char *path)
                        bit = DO_NOFUNC;
                        break;
                case CMDBUILTIN:
-                       bit = DO_ALTBLTIN;
+                       bit = cmdp->param.cmd->flags & BUILTIN_REGULAR ?
+                             0 : DO_ALTBLTIN;
                        break;
                }
                if (act & bit) {
@@ -601,7 +604,9 @@ clearcmdentry(void)
                pp = tblp;
                while ((cmdp = *pp) != NULL) {
                        if (cmdp->cmdtype == CMDNORMAL ||
-                           (cmdp->cmdtype == CMDBUILTIN && builtinloc > 0)) {
+                           (cmdp->cmdtype == CMDBUILTIN &&
+                            !(cmdp->param.cmd->flags & BUILTIN_REGULAR) &&
+                            builtinloc > 0)) {
                                *pp = cmdp->next;
                                ckfree(cmdp);
                        } else {
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to