From 8cbbc04d97d1126d17060353a8cf85de44cb3053 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 15 Jul 2019 09:44:47 +0100 Subject: [PATCH] 44509: Prevent crash with modified path / PATH combination. Crash came from "fn() { typeset -U path=($path); unset PATH; }". Note PATH unset is global as only path was made local. --- ChangeLog | 7 ++++++- Src/params.c | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b06ec095..c1573fa04 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ +2019-07-15 Peter Stephenson + + * 44509: Src/params.c: Prevent crash with modified PATH / path + combination in function. + 2019-07-10 Peter Stephenson - * 44305: Functions/Chpwd/zsh_directory_name_generic: Longest + * 44505: Functions/Chpwd/zsh_directory_name_generic: Longest prefix matching was broken if there were suffixes indicating further handling. diff --git a/Src/params.c b/Src/params.c index 1859c7c12..1499e3a40 100644 --- a/Src/params.c +++ b/Src/params.c @@ -3617,10 +3617,18 @@ unsetparam_pm(Param pm, int altflag, int exp) altpm = (Param) paramtab->getnode(paramtab, altremove); /* tied parameters are at the same local level as each other */ oldpm = NULL; - while (altpm && altpm->level > pm->level) { - /* param under alternate name hidden by a local */ - oldpm = altpm; - altpm = altpm->old; + /* + * Look for param under alternate name hidden by a local. + * If this parameter is special, however, the visible + * parameter is the special and the hidden one is keeping + * an old value --- we just mark the visible one as unset. + */ + if (altpm && !(altpm->node.flags & PM_SPECIAL)) + { + while (altpm && altpm->level > pm->level) { + oldpm = altpm; + altpm = altpm->old; + } } if (altpm) { if (oldpm && !altpm->level) {