From 490e89e24067500e2e7b672ffaf96dd888fca3a1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 26 Apr 2019 03:16:26 +0200 Subject: [PATCH] LibC: Add execvpe() and make execvp()'ed children inherit environment. --- Kernel/Process.cpp | 2 ++ LibC/unistd.cpp | 15 ++++++++++----- LibC/unistd.h | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 5189fd41ca3..c379146160e 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -442,6 +442,8 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en // On success, the kernel stack will be lost. if (!validate_read_str(filename)) return -EFAULT; + if (!*filename) + return -ENOENT; if (argv) { if (!validate_read_typed(argv)) return -EFAULT; diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index ab691151e5b..41051bb53bb 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -45,11 +45,11 @@ int execve(const char* filename, char* const argv[], char* const envp[]) __RETURN_WITH_ERRNO(rc, rc, -1); } -int execvp(const char* filename, char* const argv[]) +int execvpe(const char* filename, char* const argv[], char* const envp[]) { - int rc = execve(filename, argv, nullptr); + int rc = execve(filename, argv, environ); if (rc < 0 && errno != ENOENT) { - printf("execvp failed on first with %s\n", strerror(errno)); + fprintf(stderr, "execvpe() failed on first with %s\n", strerror(errno)); return rc; } String path = getenv("PATH"); @@ -58,9 +58,9 @@ int execvp(const char* filename, char* const argv[]) auto parts = path.split(':'); for (auto& part : parts) { auto candidate = String::format("%s/%s", part.characters(), filename); - rc = execve(candidate.characters(), argv, environ); + int rc = execve(candidate.characters(), argv, environ); if (rc < 0 && errno != ENOENT) { - printf("execvp failed on attempt (%s) with %s\n", candidate.characters(), strerror(errno)); + printf("execvpe() failed on attempt (%s) with %s\n", candidate.characters(), strerror(errno)); return rc; } } @@ -68,6 +68,11 @@ int execvp(const char* filename, char* const argv[]) return -1; } +int execvp(const char* filename, char* const argv[]) +{ + return execvpe(filename, argv, environ); +} + int execl(const char* filename, const char* arg0, ...) { Vector args; diff --git a/LibC/unistd.h b/LibC/unistd.h index 2f9f7d01e6d..e3d0d85ffbc 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -28,6 +28,7 @@ inline int getpagesize() { return 4096; } pid_t fork(); int execv(const char* path, char* const argv[]); int execve(const char* filename, char* const argv[], char* const envp[]); +int execvpe(const char* filename, char* const argv[], char* const envp[]); int execvp(const char* filename, char* const argv[]); int execl(const char* filename, const char* arg, ...); void sync();