diff options
Diffstat (limited to 'libc/unistd')
-rw-r--r-- | libc/unistd/execl.c | 2 | ||||
-rw-r--r-- | libc/unistd/execlp.c | 2 | ||||
-rw-r--r-- | libc/unistd/execvep.c | 59 |
3 files changed, 33 insertions, 30 deletions
diff --git a/libc/unistd/execl.c b/libc/unistd/execl.c index a05867ef8..9d49d5abd 100644 --- a/libc/unistd/execl.c +++ b/libc/unistd/execl.c @@ -26,7 +26,7 @@ int execl(__const char *path, __const char *arg, ...) if (i <= 16) argv = shortargv; else { - argv = (const char **) malloc(sizeof(char *) * i); + argv = (const char **) alloca(sizeof(char *) * i); } argv[0] = arg; diff --git a/libc/unistd/execlp.c b/libc/unistd/execlp.c index fef10d376..1e2f6558d 100644 --- a/libc/unistd/execlp.c +++ b/libc/unistd/execlp.c @@ -28,7 +28,7 @@ int execlp(__const char *file, __const char *arg, ...) if (i <= 16) argv = shortargv; else { - argv = (const char **) malloc(sizeof(char *) * i); + argv = (const char **) alloca(sizeof(char *) * i); } argv[0] = arg; diff --git a/libc/unistd/execvep.c b/libc/unistd/execvep.c index 4ac7692e9..6cd8cbaf9 100644 --- a/libc/unistd/execvep.c +++ b/libc/unistd/execvep.c @@ -1,43 +1,46 @@ - #include <unistd.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> int execvep(const char *path, char *__const argv[], char *__const envp[]) { - if (!strchr(path, '/')) { - char partial[128]; - char *p = getenv("PATH"); - char *p2; - - if (!p) - p = "/bin:/usr/bin"; + if (!strchr(path, '/')) { + char *p = getenv("PATH"); - for (; p && *p;) { + if (!p) + p = "/bin:/usr/bin"; - strcpy(partial, p); + for (; p && *p;) { + char partial[FILENAME_MAX]; + char *p2; - p2 = strchr(partial, ':'); - if (p2) - *p2 = '\0'; + p2 = strchr(p, ':'); + if (p2) { + size_t len = p2 - p; + strncpy(partial, p, len); + partial[len] = 0; + } else { + strcpy(partial, p); + } - if (strlen(partial)) - strcat(partial, "/"); - strcat(partial, path); + if (strlen(partial)) + strcat(partial, "/"); + strcat(partial, path); - execve(partial, argv, envp); + execve(partial, argv, envp); - if (errno != ENOENT) - return -1; - - p2 = strchr(p, ':'); - if (p2) - p = p2 + 1; - else - p = 0; - } + if (errno != ENOENT) return -1; - } else - return execve(path, argv, envp); + + if (p2) { + p = p2 + 1; + } else { + p = 0; + } + } + return -1; + } else + return execve(path, argv, envp); } |