Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Fix zparseopts segfault



Hi all,

Commit d051857e0 introduced a null dereference bug in bin_zparseopts. If
the parameter argument to `-v` in zparseopts is unset or not an array,
then getaparam will return NULL and zsh will segfault.

Feel free to change the error message in the patch if there's something
better.

/jsks

---
 Src/Modules/zutil.c     |  4 ++++
 Test/V12zparseopts.ztst | 19 +++++++++++++++++++
 2 files changed, 23 insertions(+)

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
-- 
2.51.0





Messages sorted by: Reverse Date, Date, Thread, Author