diff --git a/DevTools/UserspaceEmulator/Emulator.cpp b/DevTools/UserspaceEmulator/Emulator.cpp index fd1e71bab3..33f956900a 100644 --- a/DevTools/UserspaceEmulator/Emulator.cpp +++ b/DevTools/UserspaceEmulator/Emulator.cpp @@ -957,7 +957,7 @@ int Emulator::virt$execve(FlatPtr params_addr) auto copy_string_list = [this](auto& output_vector, auto& string_list) { for (size_t i = 0; i < string_list.length; ++i) { Syscall::StringArgument string; - mmu().copy_from_vm(&string, (FlatPtr)&string_list.strings[i], sizeof(string)); + mmu().copy_from_vm(&string, (FlatPtr)&string_list.strings.ptr()[i], sizeof(string)); output_vector.append(String::copy(mmu().copy_buffer_from_vm((FlatPtr)string.characters, string.length))); } }; diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 5598e609bd..4538c7109e 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -241,7 +241,7 @@ struct ImmutableBufferArgument { }; struct StringListArgument { - StringArgument* strings { nullptr }; + Userspace strings { }; size_t length { 0 }; }; diff --git a/Kernel/Process.h b/Kernel/Process.h index e84d140913..132eecdead 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -257,7 +257,7 @@ public: int sys$ttyname(int fd, Userspace, size_t); int sys$ptsname(int fd, Userspace, size_t); pid_t sys$fork(RegisterState&); - int sys$execve(const Syscall::SC_execve_params*); + int sys$execve(Userspace); int sys$dup(int oldfd); int sys$dup2(int oldfd, int newfd); int sys$sigaction(int signum, const sigaction* act, sigaction* old_act); diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index 6e8b4ab5ab..93f56ee73a 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -544,7 +544,7 @@ int Process::exec(String path, Vector arguments, Vector environm return 0; } -int Process::sys$execve(const Syscall::SC_execve_params* user_params) +int Process::sys$execve(Userspace user_params) { REQUIRE_PROMISE(exec); @@ -568,14 +568,14 @@ int Process::sys$execve(const Syscall::SC_execve_params* user_params) path = path_arg.value(); } - auto copy_user_strings = [&](const auto& list, auto& output) { + auto copy_user_strings = [this](const auto& list, auto& output) { if (!list.length) return true; if (!validate_read_typed(list.strings, list.length)) return false; Vector strings; strings.resize(list.length); - copy_from_user(strings.data(), list.strings, list.length * sizeof(Syscall::StringArgument)); + copy_from_user(strings.data(), list.strings.unsafe_userspace_ptr(), list.length * sizeof(Syscall::StringArgument)); for (size_t i = 0; i < list.length; ++i) { auto string = validate_and_copy_string_from_user(strings[i]); if (string.is_null()) diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index c427396784..2332ee1f8d 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -94,8 +94,8 @@ int execve(const char* filename, char* const argv[], char* const envp[]) auto copy_strings = [&](auto& vec, size_t count, auto& output) { output.length = count; for (size_t i = 0; vec[i]; ++i) { - output.strings[i].characters = vec[i]; - output.strings[i].length = strlen(vec[i]); + output.strings.ptr()[i].characters = vec[i]; + output.strings.ptr()[i].length = strlen(vec[i]); } };