Package: libc6
Version: 2.0.7.19981211-4
It seems exec*() is having problems with entries in the PATH pointing
to an file instead of a directory. It should skip those bad entries
(like it does for missing directories), but instead it stop at those
ones and never try the next directories. For exemple, in a bash shell :
(note: I've used tar+gzip in this example, but every program which
spawn, exec* or popen another prog will fail in the same way)
~/src $ which gzip
/bin/gzip
~/src $ PATH=/bin tar tvzf gnupg-0.9.2.tar.gz
-rw-r--r-- 501/501 12046 1999-01-20 22:45 gnupg-0.9.2/Makefile.in
-rw-r--r-- 501/501 17563 1999-01-13 12:48 gnupg-0.9.2/README
[...blablabla...]
~/src $ PATH="/etc/passwd:/bin" tar tvzf gnupg-0.9.2.tar.gz
tar (child): Cannot exec gzip: Not a directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error exit delayed from previous errors
~/src $ PATH="/some/missing/dir:/bin" tar tvzf gnupg-0.9.2.tar.gz
-rw-r--r-- 501/501 12046 1999-01-20 22:45 gnupg-0.9.2/Makefile.in
-rw-r--r-- 501/501 17563 1999-01-13 12:48 gnupg-0.9.2/README
[...blablabla...]
~/src $ PATH="/bin:/etc/passwd" tar tvzf gnupg-0.9.2.tar.gz
-rw-r--r-- 501/501 12046 1999-01-20 22:45 gnupg-0.9.2/Makefile.in
-rw-r--r-- 501/501 17563 1999-01-13 12:48 gnupg-0.9.2/README
[...blablabla...]
Here's a little strace witch shows that exec* functions are stopping
their search when a file is in the PATH :
~/src $ PATH="usr/local/bin:/usr/bin:/etc/passwd:/bin" strace -f tar tvzf gnupg-0.9.2.tar.gz
execve("/bin/tar", ["tar", "tvzf", "gnupg-0.9.2.tar.gz"], [/* 34 vars */]) = 0
[...]
pipe([3, 4]) = 0
fork() = 1761
[...]
[pid 1761] execve("/usr/local/bin/gzip", ["gzip", "-d"], [/* 34 vars */]) = -1 ENOENT (No such file or directory)
[pid 1761] execve("/usr/bin/gzip", ["gzip", "-d"], [/* 34 vars */]) = -1 ENOENT (No such file or directory)
[pid 1761] execve("/etc/passwd/gzip", ["gzip", "-d"], [/* 34 vars */]) = -1 ENOTDIR (Not a directory)
[pid 1761] write(2, "tar (child): ", 13) = 13
[pid 1761] write(2, "Cannot exec gzip", 16) = 16
[pid 1761] write(2, ": Not a directory", 17) = 17
[pid 1761] write(2, "\n", 1) = 1
[pid 1761] write(2, "tar (child): ", 13) = 13
[pid 1761] write(2, "Error is not recoverable: exitin"..., 37) = 37
[pid 1761] write(2, "\n", 1) = 1
[pid 1761] _exit(2) = ?
<... read resumed> "", 10240) = 0
--- SIGCHLD (Child exited) ---
--
Rémi <rguyom@mail.dotcom.fr> | Don't waste your computer's time :
PGP-encrypt anything important: | http://www.distributed.net/
www.gnupg.org - KeyID:0x85BD8B1B | http://www.distributed.net/cores/
Attachment:
pgp4nHjiyAqlV.pgp
Description: PGP signature