diff options
author | Andrey Borzenkov <bor@users.sourceforge.net> | 2005-08-18 18:19:29 +0000 |
---|---|---|
committer | Andrey Borzenkov <bor@users.sourceforge.net> | 2005-08-18 18:19:29 +0000 |
commit | a6ebb7bfc3d1223860749a962703d56e7c81a098 (patch) | |
tree | 2d92ffc8c35072717bed9b424ee5828abc0a28c9 /Src | |
parent | c26b8accb4b242991e4aae444a6799576a36783d (diff) | |
download | zsh-a6ebb7bfc3d1223860749a962703d56e7c81a098.tar.gz zsh-a6ebb7bfc3d1223860749a962703d56e7c81a098.tar.xz zsh-a6ebb7bfc3d1223860749a962703d56e7c81a098.zip |
21664: unmetafy ztat() argument
Diffstat (limited to 'Src')
-rw-r--r-- | Src/Zle/compcore.c | 11 | ||||
-rw-r--r-- | Src/Zle/compresult.c | 28 |
2 files changed, 19 insertions, 20 deletions
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 0ae5fd3c5..4b6c7a3af 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -2471,24 +2471,17 @@ add_match_data(int alt, char *str, char *orig, Cline line, cm->modec = '\0'; if ((flags & CMF_FILE) && orig[0] && orig[strlen(orig) - 1] != '/') { struct stat buf; - char *pb, *blah; - int blahl; + char *pb; pb = (char *) zhalloc((cm->prpre ? strlen(cm->prpre) : 0) + 3 + strlen(orig)); sprintf(pb, "%s%s", (cm->prpre ? cm->prpre : "./"), orig); - blah = ztrdup(pb); - - unmetafy(blah, &blahl); - - if (!ztat(blah, &buf, 1)) { + if (!ztat(pb, &buf, 1)) { cm->mode = buf.st_mode; if ((cm->modec = file_type(buf.st_mode)) == ' ') cm->modec = '\0'; } - - free(blah); } if ((*compqstack == '\\' && compqstack[1]) || (autoq && *compqstack && compqstack[1] == '\\')) diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c index e3b7d0523..d80a60ac1 100644 --- a/Src/Zle/compresult.c +++ b/Src/Zle/compresult.c @@ -849,27 +849,33 @@ do_ambiguous(void) * parameter says if we have to do lstat() or stat(). I think this * * should instead be done by use of a general function to expand a * * filename (stripping backslashes), combined with the actual * - * (l)stat(). */ + * (l)stat(). * + * Make sure input is unmetafied */ /**/ mod_export int ztat(char *nam, struct stat *buf, int ls) { - if (!(ls ? lstat(nam, buf) : stat(nam, buf))) - return 0; - else { - char *p; - VARARR(char, b, strlen(nam) + 1); + int ret; + + nam = unmeta(nam); + if (!nam) + return -1; - for (p = b; *nam; nam++) - if (*nam == '\\' && nam[1]) - *p++ = *++nam; + if ((ret = ls ? lstat(nam, buf) : stat(nam, buf))) { + char *p, *q; + + for (p = q = nam; *q; q++) + if (*q == '\\' && q[1]) + *p++ = *++q; else - *p++ = *nam; + *p++ = *q; *p = '\0'; - return ls ? lstat(b, buf) : stat(b, buf); + ret = ls ? lstat(nam, buf) : stat(nam, buf); } + + return ret; } /* Insert all matches in the command line. */ |