Kernel: Forked processes should inherit arguments and environment.

This commit is contained in:
Andreas Kling 2019-01-21 02:58:19 +01:00
parent 6127d33cee
commit 61e50780aa
Notes: sideshowbarker 2024-07-19 15:59:26 +09:00
2 changed files with 16 additions and 19 deletions

View file

@ -224,11 +224,8 @@ Process* Process::fork(RegisterDump& regs)
dbgprintf("fork: child=%p\n", child);
#endif
#if 0
// FIXME: An honest fork() would copy these. Needs a Vector copy ctor.
child->m_arguments = m_arguments;
child->m_initialEnvironment = m_initialEnvironment;
#endif
child->m_initial_arguments = m_initial_arguments;
child->m_initial_environment = m_initial_environment;
for (auto& region : m_regions) {
#ifdef FORK_DEBUG
@ -408,8 +405,8 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
m_tss.ss2 = m_pid;
m_executable = descriptor->inode();
m_arguments = move(arguments);
m_initialEnvironment = move(environment);
m_initial_arguments = move(arguments);
m_initial_environment = move(environment);
#ifdef TASK_DEBUG
kprintf("Process %u (%s) exec'd %s @ %p\n", pid(), name().characters(), path.characters(), m_tss.eip);
@ -525,14 +522,14 @@ int Process::sys$get_environment(char*** environ)
MM.map_region(*this, *region);
char* envpage = (char*)region->linearAddress.get();
*environ = (char**)envpage;
char* bufptr = envpage + (sizeof(char*) * (m_initialEnvironment.size() + 1));
for (size_t i = 0; i < m_initialEnvironment.size(); ++i) {
char* bufptr = envpage + (sizeof(char*) * (m_initial_environment.size() + 1));
for (size_t i = 0; i < m_initial_environment.size(); ++i) {
(*environ)[i] = bufptr;
memcpy(bufptr, m_initialEnvironment[i].characters(), m_initialEnvironment[i].length());
bufptr += m_initialEnvironment[i].length();
memcpy(bufptr, m_initial_environment[i].characters(), m_initial_environment[i].length());
bufptr += m_initial_environment[i].length();
*(bufptr++) = '\0';
}
(*environ)[m_initialEnvironment.size()] = nullptr;
(*environ)[m_initial_environment.size()] = nullptr;
return 0;
}
@ -543,13 +540,13 @@ int Process::sys$get_arguments(int* argc, char*** argv)
return -ENOMEM;
MM.map_region(*this, *region);
char* argpage = (char*)region->linearAddress.get();
*argc = m_arguments.size();
*argc = m_initial_arguments.size();
*argv = (char**)argpage;
char* bufptr = argpage + (sizeof(char*) * m_arguments.size());
for (size_t i = 0; i < m_arguments.size(); ++i) {
char* bufptr = argpage + (sizeof(char*) * m_initial_arguments.size());
for (size_t i = 0; i < m_initial_arguments.size(); ++i) {
(*argv)[i] = bufptr;
memcpy(bufptr, m_arguments[i].characters(), m_arguments[i].length());
bufptr += m_arguments[i].length();
memcpy(bufptr, m_initial_arguments[i].characters(), m_initial_arguments[i].length());
bufptr += m_initial_arguments[i].length();
*(bufptr++) = '\0';
}
return 0;

View file

@ -347,8 +347,8 @@ private:
static void notify_waiters(pid_t waitee, int exit_status, int signal);
Vector<String> m_arguments;
Vector<String> m_initialEnvironment;
Vector<String> m_initial_arguments;
Vector<String> m_initial_environment;
HashTable<gid_t> m_gids;
Region* m_stack_region { nullptr };