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) {