summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2011-02-05 14:01:46 +0000
committerjilles <jilles@FreeBSD.org>2011-02-05 14:01:46 +0000
commit852a80acf72e4c96489249a2958546b2155b3f2b (patch)
tree84915aacc0d57994a9e01403afbe1241feeb0859
parenta81357fbe93ddb2be80ff1401450234c412c135d (diff)
downloadFreeBSD-src-852a80acf72e4c96489249a2958546b2155b3f2b.zip
FreeBSD-src-852a80acf72e4c96489249a2958546b2155b3f2b.tar.gz
sh: Forget all cached command locations on any PATH change.
POSIX requires this and it is simpler than the previous code that remembered command locations when appending directories to PATH. In particular, PATH=$PATH is no longer a no-op but discards all cached command locations.
-rw-r--r--bin/sh/exec.c25
-rw-r--r--tools/regression/bin/sh/execution/hash1.012
2 files changed, 13 insertions, 24 deletions
diff --git a/bin/sh/exec.c b/bin/sh/exec.c
index 6297e9b..67eafff 100644
--- a/bin/sh/exec.c
+++ b/bin/sh/exec.c
@@ -494,30 +494,7 @@ hashcd(void)
void
changepath(const char *newval)
{
- const char *old, *new;
- int idx;
- int firstchange;
-
- old = pathval();
- new = newval;
- firstchange = 9999; /* assume no change */
- idx = 0;
- for (;;) {
- if (*old != *new) {
- firstchange = idx;
- if ((*old == '\0' && *new == ':')
- || (*old == ':' && *new == '\0'))
- firstchange++;
- old = new; /* ignore subsequent differences */
- }
- if (*new == '\0')
- break;
- if (*new == ':') {
- idx++;
- }
- new++, old++;
- }
- clearcmdentry(firstchange);
+ clearcmdentry(0);
}
diff --git a/tools/regression/bin/sh/execution/hash1.0 b/tools/regression/bin/sh/execution/hash1.0
new file mode 100644
index 0000000..a645c2a
--- /dev/null
+++ b/tools/regression/bin/sh/execution/hash1.0
@@ -0,0 +1,12 @@
+# $FreeBSD$
+
+T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
+trap 'rm -rf "${T}"' 0
+PATH=$T:$PATH
+ls -ld . >/dev/null
+cat <<EOF >"$T/ls"
+:
+EOF
+chmod 755 "$T/ls"
+PATH=$PATH
+ls -ld .
OpenPOWER on IntegriCloud