summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoshua Krusell <js.shirin@gmail.com>2025-10-06 10:47:28 +0200
committerdana <dana@dana.is>2025-10-24 14:32:20 -0500
commit8d21e54bdb964c0aef25339c397d145feaaa3a24 (patch)
tree64c0585a1f94e151cdb12c9432eb0be170d54ad8
parentgithub #131: add missing options (diff)
downloadzsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar.gz
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar.bz2
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar.lz
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar.xz
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.tar.zst
zsh-8d21e54bdb964c0aef25339c397d145feaaa3a24.zip
53988: fix zparseopts segfault
-rw-r--r--ChangeLog5
-rw-r--r--Src/Modules/zutil.c4
-rw-r--r--Test/V12zparseopts.ztst19
3 files changed, 28 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index e360647a2..f939d4894 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2025-10-24 dana <dana@dana.is>
+
+ * Joshua Krusell: 53988: Src/Modules/zutil.c,
+ Test/V12zparseopts.ztst: fix zparseopts segfault
+
2025-10-23 Oliver Kiddle <opk@zsh.org>
* 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
@@ -112,6 +112,25 @@
>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
print -r - ret: $?, optv: $optv, aa: $aa, ab: $ab, argv: $argv