diff options
| author | Joshua Krusell <js.shirin@gmail.com> | 2025-10-06 10:47:28 +0200 |
|---|---|---|
| committer | dana <dana@dana.is> | 2025-10-24 14:32:20 -0500 |
| commit | 8d21e54bdb964c0aef25339c397d145feaaa3a24 (patch) | |
| tree | 64c0585a1f94e151cdb12c9432eb0be170d54ad8 | |
| parent | github #131: add missing options (diff) | |
| download | zsh-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-- | ChangeLog | 5 | ||||
| -rw-r--r-- | Src/Modules/zutil.c | 4 | ||||
| -rw-r--r-- | Test/V12zparseopts.ztst | 19 |
3 files changed, 28 insertions, 0 deletions
@@ -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 |
