summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2011-05-27 20:01:46 +0000
committerjilles <jilles@FreeBSD.org>2011-05-27 20:01:46 +0000
commit5c7c156d1e87d7f343acc5808137d89bd70c871b (patch)
tree8a0532484b27c08786f29c30bbb2d974b0366354 /bin
parent5499b0b9d54eff4cc9b3a16b9a1ed77df9d1f9d9 (diff)
downloadFreeBSD-src-5c7c156d1e87d7f343acc5808137d89bd70c871b.zip
FreeBSD-src-5c7c156d1e87d7f343acc5808137d89bd70c871b.tar.gz
sh: Correct criterion for using CDPATH in cd.
CDPATH should be ignored not only for pathnames starting with '/' but also for pathnames whose first component is '.' or '..'. The man page already describes this behaviour.
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/cd.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/bin/sh/cd.c b/bin/sh/cd.c
index 2cd9daf..b1b0fc0 100644
--- a/bin/sh/cd.c
+++ b/bin/sh/cd.c
@@ -123,7 +123,10 @@ cdcmd(int argc, char **argv)
else
dest = ".";
}
- if (*dest == '/' || (path = bltinlookup("CDPATH", 1)) == NULL)
+ if (dest[0] == '/' ||
+ (dest[0] == '.' && (dest[1] == '/' || dest[1] == '\0')) ||
+ (dest[0] == '.' && dest[1] == '.' && (dest[2] == '/' || dest[2] == '\0')) ||
+ (path = bltinlookup("CDPATH", 1)) == NULL)
path = nullstr;
while ((p = padvance(&path, dest)) != NULL) {
if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) {
OpenPOWER on IntegriCloud