From 0848b7534ed918503c36a4b217ab5f6053805763 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Mon, 4 Mar 2024 21:21:20 -0800 Subject: 52659: Fix crash on unset-through-nameref, add regression test --- ChangeLog | 3 +++ Src/builtin.c | 6 ++++-- Test/K01nameref.ztst | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2d4d9922e..bd8eeafcf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2024-03-04 Bart Schaefer + * 52659: Src/builtin.c, Test/K01nameref.ztst: Fix crash when unset + was called on a named referece, add regression test + * 52650 plus minor fixes: Doc/Zsh/builtins.yo, Doc/Zsh/expn.yo, Doc/Zsh/func.yo, Doc/Zsh/mod_ksh93.yo, Etc/FAQ.yo, Src/Modules/ksh93.c, Src/builtin.c, Src/exec.c, Src/params.c, diff --git a/Src/builtin.c b/Src/builtin.c index ba9cb03c2..0aae1fcde 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -3935,9 +3935,11 @@ bin_unset(char *name, char **argv, Options ops, int func) int ref = (pm->node.flags & PM_NAMEREF); if (!(pm = (Param)resolve_nameref(pm, NULL))) continue; - if (ref && pm->level < locallevel) { + if (ref && pm->level < locallevel && + !(pm->node.flags & PM_READONLY)) { /* Just mark unset, do not remove from table */ - pm->node.flags |= PM_DECLARED|PM_UNSET; + stdunsetfn(pm, 0); + pm->node.flags |= PM_DECLARED; continue; } } diff --git a/Test/K01nameref.ztst b/Test/K01nameref.ztst index 47d32697c..e45b922e2 100644 --- a/Test/K01nameref.ztst +++ b/Test/K01nameref.ztst @@ -711,6 +711,31 @@ F:Checking for a bug in zmodload that affects later tests >typeset -n ref=two >typeset -n ref=var + typeset -g .K01.scalar='RW' + typeset -gA .K01.assoc=(x y) + typeset -ga .K01.array=(z) + typeset -gi .K01.integer=0 + typeset -gE .K01.double=0.0 + typeset -gF .K01.float=0.0 + typeset -gr .K01.readonly='RO' + typeset -n gref + for gref in ARGC .K01.{scalar,assoc,array,integer,double,float,readonly} + do + { unset gref } always { TRY_BLOCK_ERROR=0 } + done + typeset -p .K01.{scalar,assoc,array,integer,double,float,readonly} + unset .K01.{scalar,assoc,array,integer,double,float} +0:unset various types via nameref, including a readonly special +>typeset -g .K01.scalar +>typeset -g -A .K01.assoc +>typeset -g -a .K01.array +>typeset -g -i .K01.integer +>typeset -g -E .K01.double +>typeset -g -F .K01.float +>typeset -g -r .K01.readonly=RO +*?*read-only variable: ARGC +*?*read-only variable: .K01.readonly + unset -n ref unset one typeset -n ref -- cgit 1.4.1