diff options
author | Sebastian Gniazdowski <psprint@fastmail.com> | 2016-11-08 02:27:04 -0800 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2016-11-08 10:49:13 +0000 |
commit | 68a576bc552af1a5484fda9d5e28eff7ca5a2364 (patch) | |
tree | 0914f5f29c5db289fa21882b8c8ffac2effeeb49 /Src/params.c | |
parent | 39521515c3be054170eb9507c520f0e433cd304e (diff) | |
download | zsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.tar.gz zsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.tar.xz zsh-68a576bc552af1a5484fda9d5e28eff7ca5a2364.zip |
39869: can transfer ownership of core of array when assigning
Diffstat (limited to 'Src/params.c')
-rw-r--r-- | Src/params.c | 11 |
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); } } |