>From d69ba249faeab0e6edb95062482d4f59fde01039 Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Fri, 11 Nov 2016 02:25:21 +0000 Subject: [PATCH] whence: Honor PATH_DIRS option for arguments that start with './' or '../'. While here, add some docstrings. --- Src/exec.c | 23 ++++++++++++++++------- Test/E01options.ztst | 4 ++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Src/exec.c b/Src/exec.c index a01a633..ad80dd0 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 40e96af..45df9f5 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