diff --git a/kernel/src/sys/exec.cpp b/kernel/src/sys/exec.cpp index d0e52ba4..9cef5d2e 100644 --- a/kernel/src/sys/exec.cpp +++ b/kernel/src/sys/exec.cpp @@ -31,21 +31,6 @@ static Result> copy_string_vector_from_userspace(u64 address) return result; } -static Result copy_string_vector_to_userspace(const Vector& vec, ThreadImage& image) -{ - Vector user_vec; - for (const auto& item : vec) - { - // Copy each individual string and retrieve a userspace pointer to said copy - u64 addr = TRY(image.push_mem_on_stack((const u8*)item.chars(), item.length() + 1)); - TRY(user_vec.try_append(addr)); - } - - TRY(user_vec.try_append((u64) nullptr)); - // Copy the actual vector of userspace pointers to the stack - return TRY(image.push_mem_on_stack((u8*)user_vec.data(), user_vec.size() * sizeof(u64))); -} - Result sys_exec(Registers* regs, SyscallArgs args) { auto path = TRY(MemoryManager::strdup_from_user(args[0])); @@ -68,7 +53,7 @@ Result sys_exec(Registers* regs, SyscallArgs args) kdbgln("exec: copying argv to image memory (argc = %zu)", argv.size()); - u64 user_argv = TRY(copy_string_vector_to_userspace(argv, *image)); + u64 user_argv = TRY(image->push_string_vector_on_stack(argv)); usize user_argc = argv.size(); // From now on, nothing should fail. diff --git a/kernel/src/thread/ThreadImage.cpp b/kernel/src/thread/ThreadImage.cpp index 77b5a6d5..31d46b1f 100644 --- a/kernel/src/thread/ThreadImage.cpp +++ b/kernel/src/thread/ThreadImage.cpp @@ -92,6 +92,21 @@ Result ThreadImage::push_mem_on_stack(const u8* mem, usize size) return m_sp; } +Result ThreadImage::push_string_vector_on_stack(const Vector& vec) +{ + Vector user_vec; + for (const auto& item : vec) + { + // Copy each individual string and retrieve a userspace pointer to said copy + u64 addr = TRY(push_mem_on_stack((const u8*)item.chars(), item.length() + 1)); + TRY(user_vec.try_append(addr)); + } + + TRY(user_vec.try_append((u64) nullptr)); + // Copy the actual vector of userspace pointers to the stack + return TRY(push_mem_on_stack((u8*)user_vec.data(), user_vec.size() * sizeof(u64))); +} + void ThreadImage::apply(Thread* thread) { thread->init_regs_user(); diff --git a/kernel/src/thread/ThreadImage.h b/kernel/src/thread/ThreadImage.h index 1036f4e4..49835fcd 100644 --- a/kernel/src/thread/ThreadImage.h +++ b/kernel/src/thread/ThreadImage.h @@ -10,6 +10,7 @@ #include #include #include +#include class Thread; @@ -21,6 +22,7 @@ class ThreadImage static Result> clone_from_thread(Thread* parent); Result push_mem_on_stack(const u8* mem, usize size); + Result push_string_vector_on_stack(const Vector& vec); void apply(Thread* thread);