From 8d21e54bdb964c0aef25339c397d145feaaa3a24 Mon Sep 17 00:00:00 2001 From: Joshua Krusell Date: Mon, 6 Oct 2025 10:47:28 +0200 Subject: 53988: fix zparseopts segfault --- ChangeLog | 5 +++++ Src/Modules/zutil.c | 4 ++++ Test/V12zparseopts.ztst | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/ChangeLog b/ChangeLog index e360647a2..f939d4894 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2025-10-24 dana + + * Joshua Krusell: 53988: Src/Modules/zutil.c, + Test/V12zparseopts.ztst: fix zparseopts segfault + 2025-10-23 Oliver Kiddle * Christopher Bock: github #131 (with tweaks by dana): diff --git a/Src/Modules/zutil.c b/Src/Modules/zutil.c index 676fe1872..a129cc5fe 100644 --- a/Src/Modules/zutil.c +++ b/Src/Modules/zutil.c @@ -1953,6 +1953,10 @@ bin_zparseopts(char *nam, char **args, UNUSED(Options ops), UNUSED(int func)) } } params = getaparam((paramsname = paramsname ? paramsname : "argv")); + if (!params) { + zwarnnam(nam, "no such array: %s", paramsname); + return 1; + } np = cp = pp = ((extract && del) ? arrdup(params) : params); for (; (o = *pp); pp++) { /* Not an option. With GNU style, this includes '-' */ diff --git a/Test/V12zparseopts.ztst b/Test/V12zparseopts.ztst index e6139ea5e..41c21b304 100644 --- a/Test/V12zparseopts.ztst +++ b/Test/V12zparseopts.ztst @@ -111,6 +111,25 @@ 0:zparseopts -v >ret: 0, optv: -a -b -c, argvv: 1 2 3, argv: -x -y -z 7 8 9 + () { + local -a optv + zparseopts -a optv -v argvv - a + print -r - ret: $?, optv: $optv, argv: $argv + } -a +0:zparseopts -v with unset parameter +?(anon):zparseopts:2: no such array: argvv +>ret: 1, optv: , argv: -a + + () { + local -a optv + local argvv=1 + zparseopts -a optv -v argvv - a + print -r - ret: $?, optv: $optv, argv: $argv + } -a +0:zparseopts -v with non-array argument +?(anon):zparseopts:3: no such array: argvv +>ret: 1, optv: , argv: -a + () { local -a optv aa ab zparseopts -a optv - a=aa b:=ab c:- z -- cgit v1.2.3-70-g09d2