summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/ap/plan9/execlp.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-12-03 05:35:33 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-12-03 05:35:33 +0100
commiteb9de925c63990f6b19494698e4db1eb9682e46d (patch)
tree774c129eaad9c5e0e8922885f9d310c8d6863e22 /sys/src/ape/lib/ap/plan9/execlp.c
parentf3842de5fd405859f0a2de9a6f9fed0311c4629c (diff)
ape: fix more bugs, use /env and /proc instead of #e and #p, cleanup
remove envname length limitation in _envsetup() by using allocated buffer and use /env instead of #e use /proc and getpid() instead of #p and #c in readprocfdinit() fix buffer overflow in execlp(), check if name of failed exec starts with / . or is \0 make sure not to close our own filedescriptors for FD_CLOEXEC in execve(), fix wrong length check for flushing buffer to /env/_fdinfo. fix error handling cases. copy the enviroment before decoding \1 to \0 because the strings in environ[] array might not be writable. remove bogus close if we fail to open ppid file in getppid() and use /dev/ppid instead of #c/ppid
Diffstat (limited to 'sys/src/ape/lib/ap/plan9/execlp.c')
-rw-r--r--sys/src/ape/lib/ap/plan9/execlp.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/src/ape/lib/ap/plan9/execlp.c b/sys/src/ape/lib/ap/plan9/execlp.c
index ff5d71761..2bb8d3980 100644
--- a/sys/src/ape/lib/ap/plan9/execlp.c
+++ b/sys/src/ape/lib/ap/plan9/execlp.c
@@ -16,9 +16,11 @@ execlp(const char *name, const char *arg0, ...)
char buf[PATH_MAX];
if((n=execve(name, &arg0, environ)) < 0){
+ if(strchr("/.", name[0]) != 0 || strlen(name) >= sizeof(buf)-5)
+ return n;
strcpy(buf, "/bin/");
strcpy(buf+5, name);
- n = execve(buf, &name+1, environ);
+ n = execve(buf, &arg0, environ);
}
return n;
}