about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2008-10-30 15:34:18 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2008-10-30 15:34:18 +0000
commit25833cc89eef879857100d321c2140ff13f63886 (patch)
tree3a7c1d97cd0d1c01238aaac8b185e9894e31b028 /Src
parent176e0dc8217d97be260bdb8f38e7bd5ddeecdf95 (diff)
downloadzsh-25833cc89eef879857100d321c2140ff13f63886.tar.gz
zsh-25833cc89eef879857100d321c2140ff13f63886.tar.xz
zsh-25833cc89eef879857100d321c2140ff13f63886.zip
25969: two bugs with metafication plus a test for one
Diffstat (limited to 'Src')
-rw-r--r--Src/subst.c8
-rw-r--r--Src/utils.c6
2 files changed, 9 insertions, 5 deletions
diff --git a/Src/subst.c b/Src/subst.c
index df60a27ab..d76215838 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -2738,8 +2738,8 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
 		char *tmps;
 		unmetafy(*ap, &len);
 		untokenize(*ap);
-		tmps = unmetafy(promptexpand(metafy(*ap, len, META_NOALLOC),
-					     0, NULL, NULL, NULL), &len);
+		tmps = promptexpand(metafy(*ap, len, META_NOALLOC),
+				    0, NULL, NULL, NULL);
 		*ap = dupstring(tmps);
 		free(tmps);
 	    }
@@ -2749,8 +2749,8 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
 		val = dupstring(val), copied = 1;
 	    unmetafy(val, &len);
 	    untokenize(val);
-	    tmps = unmetafy(promptexpand(metafy(val, len, META_NOALLOC),
-					0, NULL, NULL, NULL), &len);
+	    tmps = promptexpand(metafy(val, len, META_NOALLOC),
+					0, NULL, NULL, NULL);
 	    val = dupstring(tmps);
 	    free(tmps);
 	}
diff --git a/Src/utils.c b/Src/utils.c
index 1dd8c3577..550f7bfa7 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -857,7 +857,9 @@ finddir(char *s)
     scanhashtable(nameddirtab, 0, 0, 0, finddir_scan, 0);
 
     if (func) {
-	char **ares = subst_string_by_func(func, "d", finddir_full);
+	char *dir_meta = metafy(finddir_full, strlen(finddir_full),
+				META_ALLOC);
+	char **ares = subst_string_by_func(func, "d", dir_meta);
 	int len;
 	if (ares && arrlen(ares) >= 2 &&
 	    (len = (int)zstrtol(ares[1], NULL, 10)) > finddir_best) {
@@ -868,6 +870,8 @@ finddir(char *s)
 	    finddir_last->diff = len - strlen(finddir_last->node.nam);
 	    finddir_best = len;
 	}
+	if (dir_meta != finddir_full)
+	    zsfree(dir_meta);
     }
 
     return finddir_last;