summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorSebastian Gniazdowski <psprint@fastmail.com>2016-11-08 02:27:04 -0800
committerPeter Stephenson <pws@zsh.org>2016-11-08 10:49:13 +0000
commit68a576bc552af1a5484fda9d5e28eff7ca5a2364 (patch)
tree0914f5f29c5db289fa21882b8c8ffac2effeeb49 /Src
parent39521515c3be054170eb9507c520f0e433cd304e (diff)
downloadzsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.tar.gz
zsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.tar.xz
zsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.zip
39869: can transfer ownership of core of array when assigning
Diffstat (limited to 'Src')
-rw-r--r--Src/params.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/Src/params.c b/Src/params.c
index 330f22bb2..0894241b9 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2647,15 +2647,20 @@ setarrvalue(Value v, char **val)
 
 	for (i = 0; i < v->start; i++)
 	    *p++ = i < pre_assignment_length ? ztrdup(*q++) : ztrdup("");
-	for (r = val; *r;)
-	    *p++ = ztrdup(*r++);
+	for (r = val; *r;) {
+            /* Give away ownership of the string */
+	    *p++ = *r++;
+	}
 	if (v->end < pre_assignment_length)
 	    for (q = old + v->end; *q;)
 		*p++ = ztrdup(*q++);
 	*p = NULL;
 
 	v->pm->gsu.a->setfn(v->pm, new);
-	freearray(val);
+
+        /* Ownership of all strings has been
+         * given away, can plainly free */
+	free(val);
     }
 }