summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Shahaf <d.s@daniel.shahaf.name>2016-11-11 02:25:21 +0000
committerDaniel Shahaf <d.s@daniel.shahaf.name>2016-11-17 15:28:42 +0000
commitc392e6c620163b84798e705dfd6608d6429b9677 (patch)
tree25439f6a6c66cc2a183f0dbba3271d74c715d36f
parent0a6098a1d4debda1d57f4a7cd42bb5c49d65cddc (diff)
downloadzsh-c392e6c620163b84798e705dfd6608d6429b9677.tar.gz
zsh-c392e6c620163b84798e705dfd6608d6429b9677.zip
39915: whence: Honor PATH_DIRS option for arguments that start with './' or '../'.
While here, add some docstrings.
-rw-r--r--ChangeLog5
-rw-r--r--Src/exec.c23
-rw-r--r--Test/E01options.ztst4
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 <d.s@daniel.shahaf.name>
+
+ * 39915: Src/exec.c, Test/E01options.ztst: whence: Honor
+ PATH_DIRS option for arguments that start with './' or '../'.
+
2016-11-17 Oliver Kiddle <opk@zsh.org>
* 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