summaryrefslogtreecommitdiff
path: root/libc/unistd
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-05-07 18:29:33 +0000
committerEric Andersen <andersen@codepoet.org>2001-05-07 18:29:33 +0000
commit4e88ea446cbc773e8f8633a6fc7bda2c155ed20a (patch)
tree8bad46b02870c53bc4ed16a654a5d3497a27f9ce /libc/unistd
parente2058fa00790c7e731e08e2a273350bf784c559e (diff)
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 <kili@outback.escape.de> so that there is not a fixed 127 byte buffer. Too easy to overflow... -Erik
Diffstat (limited to 'libc/unistd')
-rw-r--r--libc/unistd/execl.c2
-rw-r--r--libc/unistd/execlp.c2
-rw-r--r--libc/unistd/execvep.c59
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);
}