Hi,

When execvp executes the file and gets NOEXECV, it shall execute
a command interpreter as if the process is invoked by sh, and the
argv[0] shall point to the filename being started.  Therefore,
a script file without hashbang (#!) is still executed by sh utility.

However, currently uClibc set argv[0] to be the filename of the script
itself instead of the name of shell, e.g., "/bin/sh", and it is
inconsistent with the behaviors of other libc (e.g., BSD libc, glibc,
bionic libc) and how Linux kernel passed interpreter as argv[0] in
binfmt_script.   Although it’s not mandatory in terms of POSIX.1, but
busybox relies on argv[0] for "sh" applet to be run.

Without this patch, busybox complains "foo.sh: applet not found"
when executing a shell script without hashbang.

Any comment?

Thanks,
Wei-cheng Wang

diff --git a/libc/unistd/exec.c b/libc/unistd/exec.c
index 8fa42e5..91b34ad 100644
--- a/libc/unistd/exec.c
+++ b/libc/unistd/exec.c
@@ -269,7 +269,7 @@ int execvpe(const char *path, char *const argv[], char *const envp[])
 #elif defined (L_execvpe)
nargv = (char **) EXEC_ALLOC((n+2) * sizeof(char *), size2, EXEC_FUNC_EXECVPE);
 #endif
-                       nargv[0] = argv[0];
+                       nargv[0] = "/bin/sh";
                        nargv[1] = (char *)path;
                        memcpy(nargv+2, argv+1, n*sizeof(char *));
 #if defined (L_execvp)
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to