about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <okiddle@yahoo.co.uk>2018-04-07 18:48:00 +0200
committerOliver Kiddle <okiddle@yahoo.co.uk>2018-04-07 18:48:00 +0200
commitd8753f47bb29d6bd5ca8d311b80fadca719982be (patch)
tree2c58d9e288327ad3348dd7d95a12787fa0cc756e
parent31f72205630687c1cef89347863aab355296a27f (diff)
downloadzsh-d8753f47bb29d6bd5ca8d311b80fadca719982be.tar.gz
zsh-d8753f47bb29d6bd5ca8d311b80fadca719982be.tar.xz
zsh-d8753f47bb29d6bd5ca8d311b80fadca719982be.zip
42601: tidy up code for set -A/+A to not increment a NULL pointer and to be more efficient
-rw-r--r--ChangeLog3
-rw-r--r--Src/builtin.c10
2 files changed, 7 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 2cc699b67..0ced3c876 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2018-04-07  Oliver Kiddle  <okiddle@yahoo.co.uk>
 
+	* 42601: Src/builtin.c: tidy up code for set -A/+A to not
+	increment a NULL pointer and to be more efficient
+
 	* 42607, CVE-2018-1100: Src/utils.c: check bounds on buffer
 	in mail checking
 
diff --git a/Src/builtin.c b/Src/builtin.c
index fb59738f3..73cfe7ad1 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -695,13 +695,11 @@ bin_set(char *nam, char **args, UNUSED(Options ops), UNUSED(int func))
 	char **a = NULL, **y;
 	int len = arrlen(args);
 
-	if (array < 0 && (a = getaparam(arrayname))) {
-	    int al = arrlen(a);
-
-	    if (al > len)
-		len = al;
+	if (array < 0 && (a = getaparam(arrayname)) && arrlen_gt(a, len)) {
+	    a += len;
+	    len += arrlen(a);
 	}
-	for (x = y = zalloc((len + 1) * sizeof(char *)); len--; a++) {
+	for (x = y = zalloc((len + 1) * sizeof(char *)); len--;) {
 	    if (!*args)
 		args = a;
 	    *y++ = ztrdup(*args++);