diff --git a/DevTools/UserspaceEmulator/Emulator.cpp b/DevTools/UserspaceEmulator/Emulator.cpp index 8c6114a8b5..80880c4476 100644 --- a/DevTools/UserspaceEmulator/Emulator.cpp +++ b/DevTools/UserspaceEmulator/Emulator.cpp @@ -62,17 +62,17 @@ Emulator& Emulator::the() return *s_the; } -Emulator::Emulator(const Vector& arguments, NonnullRefPtr elf) +Emulator::Emulator(const Vector& arguments, const Vector& environment, NonnullRefPtr elf) : m_elf(move(elf)) , m_cpu(*this) { m_malloc_tracer = make(); ASSERT(!s_the); s_the = this; - setup_stack(arguments); + setup_stack(arguments, environment); } -void Emulator::setup_stack(const Vector& arguments) +void Emulator::setup_stack(const Vector& arguments, const Vector& environment) { auto stack_region = make(stack_location, stack_size); stack_region->set_stack(true); @@ -86,7 +86,16 @@ void Emulator::setup_stack(const Vector& arguments) argv_entries.append(m_cpu.esp().value()); } - m_cpu.push32(shadow_wrap_as_initialized(0)); // char** envp = { nullptr } + Vector env_entries; + + for (auto& variable : environment) { + m_cpu.push_string(variable.characters()); + env_entries.append(m_cpu.esp().value()); + } + + m_cpu.push32(shadow_wrap_as_initialized(0)); // char** envp = { envv_entries..., nullptr } + for (ssize_t i = env_entries.size() - 1; i >= 0; --i) + m_cpu.push32(shadow_wrap_as_initialized(env_entries[i])); u32 envp = m_cpu.esp().value(); m_cpu.push32(shadow_wrap_as_initialized(0)); // char** argv = { argv_entries..., nullptr } diff --git a/DevTools/UserspaceEmulator/Emulator.h b/DevTools/UserspaceEmulator/Emulator.h index ae0e2c5e4b..5f23ec608d 100644 --- a/DevTools/UserspaceEmulator/Emulator.h +++ b/DevTools/UserspaceEmulator/Emulator.h @@ -43,7 +43,7 @@ class Emulator { public: static Emulator& the(); - Emulator(const Vector& arguments, NonnullRefPtr); + Emulator(const Vector& arguments, const Vector& environment, NonnullRefPtr); bool load_elf(); void dump_backtrace(); @@ -68,7 +68,7 @@ private: OwnPtr m_malloc_tracer; - void setup_stack(const Vector& arguments); + void setup_stack(const Vector& arguments, const Vector& environment); int virt$get_dir_entries(int fd, FlatPtr buffer, ssize_t); int virt$ioctl(int fd, unsigned, FlatPtr); diff --git a/DevTools/UserspaceEmulator/main.cpp b/DevTools/UserspaceEmulator/main.cpp index 58549e7f66..82d90a9d1c 100644 --- a/DevTools/UserspaceEmulator/main.cpp +++ b/DevTools/UserspaceEmulator/main.cpp @@ -32,7 +32,7 @@ #include #include -int main(int argc, char** argv) +int main(int argc, char** argv, char** env) { if (argc == 1) { out() << "usage: UserspaceEmulator "; @@ -55,7 +55,12 @@ int main(int argc, char** argv) arguments.append(argv[i]); } - UserspaceEmulator::Emulator emulator(arguments, move(elf)); + Vector environment; + for (int i = 0; env[i]; ++i) { + environment.append(env[i]); + } + + UserspaceEmulator::Emulator emulator(arguments, environment, move(elf)); if (!emulator.load_elf()) return 1;