about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/params.c16
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  <p.stephenson@samsung.com>
+
+	* 44509: Src/params.c: Prevent crash with modified PATH / path
+	combination in function.
+
 2019-07-10  Peter Stephenson  <p.stephenson@samsung.com>
 
-	* 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) {