summaryrefslogtreecommitdiff
path: root/bin/sh/exec.c
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2011-02-05 12:54:59 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2011-02-05 12:54:59 +0000
commit604e8224f8258ec8cf6048ce4b6e3662e112d6a8 (patch)
tree999ded504b6f93787ff21b0740db2574608bc758 /bin/sh/exec.c
parent5d40cf5d2377e9d0d3caf6f759a4379fb3466af8 (diff)
downloadsrc-test2-604e8224f8258ec8cf6048ce4b6e3662e112d6a8.tar.gz
src-test2-604e8224f8258ec8cf6048ce4b6e3662e112d6a8.zip
Notes
Diffstat (limited to 'bin/sh/exec.c')
-rw-r--r--bin/sh/exec.c16
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);