about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2017-01-11 12:11:22 +0000
committerPeter Stephenson <pws@zsh.org>2017-01-11 12:11:22 +0000
commit47b7f2adef9d7e399af9d06a67b4db1ad55d4f32 (patch)
tree62956db751e1bfe226bae4d5b14c075ca8871c4d
parentf26d1ba6b01a358c83f28219c7a01e546e84d2ee (diff)
downloadzsh-47b7f2adef9d7e399af9d06a67b4db1ad55d4f32.tar.gz
zsh-47b7f2adef9d7e399af9d06a67b4db1ad55d4f32.tar.xz
zsh-47b7f2adef9d7e399af9d06a67b4db1ad55d4f32.zip
unposted: more care with shell function filename.
When updating shfunc structure to change filename we should be
careful to free whatever's there already, we may now be the
directory in which to find the function definition.  After loading
the field contains the full name of the file.
-rw-r--r--ChangeLog3
-rw-r--r--Src/builtin.c4
-rw-r--r--Src/exec.c2
3 files changed, 8 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 5abaf9537..da1ece42a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2017-01-11  Peter Stephenson  <p.stephenson@samsung.com>
 
+	* unposted: Src/builtin.c, Src/exec.c: be more careful to free
+	memory when updating filename in struct shfunc.
+
 	* 40327 (with minor fixes): Doc/Zsh/builtins.yo,
 	README,Src/builtin.c, Src/exec.c, Src/hashtable.c, Src/parse.c,
 	Src/zsh.h, Test/C04funcdef.ztst: add ability to autoload
diff --git a/Src/builtin.c b/Src/builtin.c
index 78d67ca8e..b986dd89a 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3275,8 +3275,10 @@ bin_functions(char *name, char **argv, Options ops, int func)
 		shf = (Shfunc) zshcalloc(sizeof *shf);
 		shfunctab->addnode(shfunctab, ztrdup(funcname), shf);
 	    }
-	    if (*argv)
+	    if (*argv) {
+		zsfree(shf->filename);
 		shf->filename = ztrdup(*argv);
+	    }
 	    shf->node.flags = on;
 	    ret = eval_autoload(shf, funcname, ops, func);
 	}
diff --git a/Src/exec.c b/Src/exec.c
index a41d05b41..7bec7ce48 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -5204,6 +5204,7 @@ loadautofn(Shfunc shf, int fksh, int autol, int current_fpath)
 	    else
 		shf->funcdef = dupeprog(prog, 0);
 	    shf->node.flags &= ~PM_UNDEFINED;
+	    zsfree(shf->filename);
 	    shf->filename = fname;
 	} else {
 	    VARARR(char, n, strlen(shf->node.nam) + 1);
@@ -5227,6 +5228,7 @@ loadautofn(Shfunc shf, int fksh, int autol, int current_fpath)
 	else
 	    shf->funcdef = dupeprog(stripkshdef(prog, shf->node.nam), 0);
 	shf->node.flags &= ~PM_UNDEFINED;
+	zsfree(shf->filename);
 	shf->filename = fname;
     }
     popheap();