diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-02-05 12:54:59 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-02-05 12:54:59 +0000 |
commit | 604e8224f8258ec8cf6048ce4b6e3662e112d6a8 (patch) | |
tree | 999ded504b6f93787ff21b0740db2574608bc758 /bin/sh/exec.c | |
parent | 5d40cf5d2377e9d0d3caf6f759a4379fb3466af8 (diff) | |
download | src-test2-604e8224f8258ec8cf6048ce4b6e3662e112d6a8.tar.gz src-test2-604e8224f8258ec8cf6048ce4b6e3662e112d6a8.zip |
Notes
Diffstat (limited to 'bin/sh/exec.c')
-rw-r--r-- | bin/sh/exec.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/bin/sh/exec.c b/bin/sh/exec.c index 07fa8bb39051..6297e9b4b07f 100644 --- a/bin/sh/exec.c +++ b/bin/sh/exec.c @@ -126,6 +126,8 @@ shellexec(char **argv, char **envp, const char *path, int idx) tryexec(cmdname, argv, envp); if (errno != ENOENT && errno != ENOTDIR) e = errno; + if (e == ENOEXEC) + break; } stunalloc(cmdname); } @@ -145,11 +147,23 @@ shellexec(char **argv, char **envp, const char *path, int idx) static void tryexec(char *cmd, char **argv, char **envp) { - int e; + int e, in; + ssize_t n; + char buf[256]; execve(cmd, argv, envp); e = errno; if (e == ENOEXEC) { + INTOFF; + in = open(cmd, O_RDONLY | O_NONBLOCK); + if (in != -1) { + n = pread(in, buf, sizeof buf, 0); + close(in); + if (n > 0 && memchr(buf, '\0', n) != NULL) { + errno = ENOEXEC; + return; + } + } *argv = cmd; *--argv = _PATH_BSHELL; execve(_PATH_BSHELL, argv, envp); |