From bf04ffb54286c44deef6e4ceb6445d6af30897f9 Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Wed, 11 Oct 2017 20:44:54 +0200 Subject: 41866: No error unsetting nonexistent function for POSIXBUILTINS --- Src/builtin.c | 6 +++++- Src/hashtable.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'Src') diff --git a/Src/builtin.c b/Src/builtin.c index 84a2beee0..0ff9e4f16 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -125,7 +125,7 @@ static struct builtin builtins[] = BUILTIN("unalias", 0, bin_unhash, 0, -1, BIN_UNALIAS, "ams", NULL), BUILTIN("unfunction", 0, bin_unhash, 1, -1, BIN_UNFUNCTION, "m", "f"), BUILTIN("unhash", 0, bin_unhash, 1, -1, BIN_UNHASH, "adfms", NULL), - BUILTIN("unset", BINF_PSPECIAL, bin_unset, 1, -1, 0, "fmv", NULL), + BUILTIN("unset", BINF_PSPECIAL, bin_unset, 1, -1, BIN_UNSET, "fmv", NULL), BUILTIN("unsetopt", 0, bin_setopt, 0, -1, BIN_UNSETOPT, NULL, NULL), BUILTIN("wait", 0, bin_fg, 0, -1, BIN_WAIT, NULL, NULL), BUILTIN("whence", 0, bin_whence, 0, -1, 0, "acmpvfsSwx:", NULL), @@ -4158,6 +4158,10 @@ bin_unhash(char *name, char **argv, Options ops, int func) for (; *argv; argv++) { if ((hn = ht->removenode(ht, *argv))) { ht->freenode(hn); + } else if (func == BIN_UNSET && isset(POSIXBUILTINS)) { + /* POSIX: unset: "Unsetting a variable or function that was * + * not previously set shall not be considered an error." */ + returnval = 0; } else { zwarnnam(name, "no such hash table element: %s", *argv); returnval = 1; diff --git a/Src/hashtable.h b/Src/hashtable.h index 3606e9785..21398e17c 100644 --- a/Src/hashtable.h +++ b/Src/hashtable.h @@ -62,6 +62,7 @@ #define BIN_UNHASH 28 #define BIN_UNALIAS 29 #define BIN_UNFUNCTION 30 +#define BIN_UNSET 31 /* These currently depend on being 0 and 1. */ #define BIN_SETOPT 0 -- cgit 1.4.1