From c392e6c620163b84798e705dfd6608d6429b9677 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Fri, 11 Nov 2016 02:25:21 +0000 Subject: 39915: whence: Honor PATH_DIRS option for arguments that start with './' or '../'. While here, add some docstrings. --- ChangeLog | 5 +++++ Src/exec.c | 23 ++++++++++++++++------- Test/E01options.ztst | 4 ++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index f51d1a0de..d278e4709 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-11-17 Daniel Shahaf + + * 39915: Src/exec.c, Test/E01options.ztst: whence: Honor + PATH_DIRS option for arguments that start with './' or '../'. + 2016-11-17 Oliver Kiddle * 39962: Src/Zle/zle_keymap.c: bind vi case conversion widgets diff --git a/Src/exec.c b/Src/exec.c index a01a633db..ad80dd059 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -806,14 +806,13 @@ findcmd(char *arg0, int docopy, int default_path) cn = hashcmd(arg0, path); if ((int) strlen(arg0) > PATH_MAX) return NULL; - for (s = arg0; *s; s++) - if (*s == '/') { - RET_IF_COM(arg0); - if (arg0 == s || unset(PATHDIRS)) { - return NULL; - } - break; + if ((s = strchr(arg0, '/'))) { + RET_IF_COM(arg0); + if (arg0 == s || unset(PATHDIRS) || !strncmp(arg0, "./", 2) || + !strncmp(arg0, "../", 3)) { + return NULL; } + } if (cn) { char nn[PATH_MAX]; @@ -848,6 +847,11 @@ findcmd(char *arg0, int docopy, int default_path) return NULL; } +/* + * Return TRUE if the given path denotes an executable regular file, or a + * symlink to one. + */ + /**/ int iscom(char *s) @@ -877,6 +881,11 @@ isreallycom(Cmdnam cn) return iscom(fullnam); } +/* + * Return TRUE if the given path contains a dot or dot-dot component + * and does not start with a slash. + */ + /**/ int isrelative(char *s) diff --git a/Test/E01options.ztst b/Test/E01options.ztst index 40e96afc9..45df9f572 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -784,6 +784,10 @@ >unsetting option... ?(eval):14: no such file or directory: pathtestdir/findme + (setopt pathdirs; path+=( /usr/bin ); type ./env) +1:whence honours PATH_DIRS option +>./env not found + setopt posixbuiltins PATH= command -v print PATH= command -V print -- cgit 1.4.1