From 4e88ea446cbc773e8f8633a6fc7bda2c155ed20a Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Mon, 7 May 2001 18:29:33 +0000 Subject: Change FILENAME_MAX to be only 255. Max filename on ext2 is 255, so there is no reason to allocate 4k. Change working of execvep.c per patch from Matthias Kilian so that there is not a fixed 127 byte buffer. Too easy to overflow... -Erik --- libc/unistd/execl.c | 2 +- libc/unistd/execlp.c | 2 +- libc/unistd/execvep.c | 59 +++++++++++++++++++++++++++------------------------ 3 files changed, 33 insertions(+), 30 deletions(-) (limited to 'libc/unistd') 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 +#include #include #include #include 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); } -- cgit v1.2.3