From c5eec9cbfc33aec8ec415c1911326be4b1e3adcd Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 3 Nov 2018 10:20:23 +0100 Subject: [PATCH] Factor out the "non-syscall" parts of sys$execve() into exec(). ..to prepare for sharing code with createUserProcess(). --- Kernel/Process.cpp | 73 +++++++++++++++++++++++++--------------------- Kernel/Process.h | 1 + 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index f0985cf59bc..33463d9aeb6 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -282,21 +282,8 @@ pid_t Process::sys$fork(RegisterDump& regs) return child->pid(); } -int Process::sys$execve(const char* filename, const char** argv, const char** envp) +int Process::exec(const String& path, Vector&& arguments, Vector&& environment) { - VALIDATE_USER_READ(filename, strlen(filename)); - if (argv) { - for (size_t i = 0; argv[i]; ++i) { - VALIDATE_USER_READ(argv[i], strlen(argv[i])); - } - } - if (envp) { - for (size_t i = 0; envp[i]; ++i) { - VALIDATE_USER_READ(envp[i], strlen(envp[i])); - } - } - - String path(filename); auto parts = path.split('/'); if (parts.isEmpty()) return -ENOENT; @@ -315,22 +302,6 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en if (!elfData) return -EIO; // FIXME: Get a more detailed error from VFS. - Vector processArguments; - if (argv) { - for (size_t i = 0; argv[i]; ++i) { - processArguments.append(argv[i]); - } - } else { - processArguments.append(parts.last()); - } - - Vector processEnvironment; - if (envp) { - for (size_t i = 0; envp[i]; ++i) { - processEnvironment.append(envp[i]); - } - } - dword entry_eip = 0; PageDirectory* old_page_directory; PageDirectory* new_page_directory; @@ -414,11 +385,11 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en MM.release_page_directory(*old_page_directory); m_executable = handle->vnode(); - m_arguments = move(processArguments); - m_initialEnvironment = move(processEnvironment); + m_arguments = move(arguments); + m_initialEnvironment = move(environment); #ifdef TASK_DEBUG - kprintf("Process %u (%s) execve'd %s @ %p\n", pid(), name().characters(), filename, m_tss.eip); + kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), filename, m_tss.eip); #endif yield(); @@ -426,6 +397,42 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en return 0; } +int Process::sys$execve(const char* filename, const char** argv, const char** envp) +{ + VALIDATE_USER_READ(filename, strlen(filename)); + if (argv) { + for (size_t i = 0; argv[i]; ++i) { + VALIDATE_USER_READ(argv[i], strlen(argv[i])); + } + } + if (envp) { + for (size_t i = 0; envp[i]; ++i) { + VALIDATE_USER_READ(envp[i], strlen(envp[i])); + } + } + + String path(filename); + auto parts = path.split('/'); + + Vector arguments; + if (argv) { + for (size_t i = 0; argv[i]; ++i) { + arguments.append(argv[i]); + } + } else { + arguments.append(parts.last()); + } + + Vector environment; + if (envp) { + for (size_t i = 0; envp[i]; ++i) { + environment.append(envp[i]); + } + } + + return exec(path, move(arguments), move(environment)); +} + int Process::sys$spawn(const char* path, const char** args) { if (args) { diff --git a/Kernel/Process.h b/Kernel/Process.h index 3f51132d588..12fdf0c5c3c 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -158,6 +158,7 @@ public: void send_signal(int signal, Process* sender); Process* fork(RegisterDump&); + int exec(const String& path, Vector&& arguments, Vector&& environment); private: friend class MemoryManager;