diff --git a/Kernel/API/Syscall.h b/Kernel/API/Syscall.h index 4d32782730..70c68838ca 100644 --- a/Kernel/API/Syscall.h +++ b/Kernel/API/Syscall.h @@ -155,7 +155,6 @@ enum class NeedsBigProcessLock { S(scheduler_set_parameters, NeedsBigProcessLock::No) \ S(sendfd, NeedsBigProcessLock::No) \ S(sendmsg, NeedsBigProcessLock::Yes) \ - S(set_coredump_metadata, NeedsBigProcessLock::No) \ S(set_mmap_name, NeedsBigProcessLock::Yes) \ S(set_process_name, NeedsBigProcessLock::No) \ S(set_thread_name, NeedsBigProcessLock::No) \ diff --git a/Kernel/API/prctl_numbers.h b/Kernel/API/prctl_numbers.h index 68042deb25..4c5d1603e3 100644 --- a/Kernel/API/prctl_numbers.h +++ b/Kernel/API/prctl_numbers.h @@ -10,3 +10,4 @@ #define PR_GET_DUMPABLE 2 #define PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 3 #define PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 4 +#define PR_SET_COREDUMP_METADATA_VALUE 5 diff --git a/Kernel/Process.h b/Kernel/Process.h index 755b0fea9c..57dd5c1afa 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -439,7 +439,6 @@ public: ErrorOr sys$disown(ProcessID); ErrorOr sys$allocate_tls(Userspace initial_data, size_t); ErrorOr sys$prctl(int option, FlatPtr arg1, FlatPtr arg2); - ErrorOr sys$set_coredump_metadata(Userspace); ErrorOr sys$anon_create(size_t, int options); ErrorOr sys$statvfs(Userspace user_params); ErrorOr sys$fstatvfs(int fd, statvfs* buf); diff --git a/Kernel/Syscalls/prctl.cpp b/Kernel/Syscalls/prctl.cpp index 678938ecc3..c76cec8580 100644 --- a/Kernel/Syscalls/prctl.cpp +++ b/Kernel/Syscalls/prctl.cpp @@ -25,7 +25,7 @@ ErrorOr Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] F return address_space().with([&](auto& space) -> ErrorOr { return space->enforces_syscall_regions(); }); - case PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS: + case PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS: { if (arg1 != 0 && arg1 != 1) return EINVAL; bool prohibit_new_annotated_syscall_regions = (arg1 == 1); @@ -38,6 +38,19 @@ ErrorOr Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] F }); return 0; } + case PR_SET_COREDUMP_METADATA_VALUE: { + auto params = TRY(copy_typed_from_user(arg1)); + if (params.key.length == 0 || params.key.length > 16 * KiB) + return EINVAL; + if (params.value.length > 16 * KiB) + return EINVAL; + auto key = TRY(try_copy_kstring_from_user(params.key)); + auto value = TRY(try_copy_kstring_from_user(params.value)); + TRY(set_coredump_property(move(key), move(value))); + return 0; + } + } + return EINVAL; }); } diff --git a/Kernel/Syscalls/process.cpp b/Kernel/Syscalls/process.cpp index e2922dec9d..af4baea820 100644 --- a/Kernel/Syscalls/process.cpp +++ b/Kernel/Syscalls/process.cpp @@ -52,19 +52,4 @@ ErrorOr Process::sys$set_process_name(Userspace user_name, return 0; } -ErrorOr Process::sys$set_coredump_metadata(Userspace user_params) -{ - VERIFY_NO_PROCESS_BIG_LOCK(this); - auto params = TRY(copy_typed_from_user(user_params)); - - if (params.key.length == 0 || params.key.length > 16 * KiB) - return EINVAL; - if (params.value.length > 16 * KiB) - return EINVAL; - auto key = TRY(try_copy_kstring_from_user(params.key)); - auto value = TRY(try_copy_kstring_from_user(params.value)); - TRY(set_coredump_property(move(key), move(value))); - return 0; -} - } diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.h b/Userland/DevTools/UserspaceEmulator/Emulator.h index c08be6e9c3..6a911466db 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator.h +++ b/Userland/DevTools/UserspaceEmulator/Emulator.h @@ -225,7 +225,6 @@ private: int virt$scheduler_set_parameters(FlatPtr); int virt$sendfd(int, int); int virt$sendmsg(int sockfd, FlatPtr msg_addr, int flags); - int virt$set_coredump_metadata(FlatPtr address); int virt$set_mmap_name(FlatPtr); int virt$set_process_name(FlatPtr buffer, int size); int virt$set_thread_name(pid_t, FlatPtr, size_t); diff --git a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp index 93909afc52..f7ba559d3a 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator_syscalls.cpp @@ -208,8 +208,6 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3) return virt$sendfd(arg1, arg2); case SC_sendmsg: return virt$sendmsg(arg1, arg2, arg3); - case SC_set_coredump_metadata: - return virt$set_coredump_metadata(arg1); case SC_set_mmap_name: return virt$set_mmap_name(arg1); case SC_set_process_name: @@ -397,22 +395,6 @@ int Emulator::virt$rename(FlatPtr params_addr) return syscall(SC_rename, ¶ms); } -int Emulator::virt$set_coredump_metadata(FlatPtr params_addr) -{ - Syscall::SC_set_coredump_metadata_params params; - mmu().copy_from_vm(¶ms, params_addr, sizeof(params)); - - auto key = mmu().copy_buffer_from_vm((FlatPtr)params.key.characters, params.key.length); - params.key.characters = (char const*)key.data(); - params.key.length = key.size(); - - auto value = mmu().copy_buffer_from_vm((FlatPtr)params.value.characters, params.value.length); - params.value.characters = (char const*)value.data(); - params.value.length = value.size(); - - return syscall(SC_set_coredump_metadata, ¶ms); -} - int Emulator::virt$dbgputstr(FlatPtr characters, int length) { auto buffer = mmu().copy_buffer_from_vm(characters, length); diff --git a/Userland/Libraries/LibC/assert.cpp b/Userland/Libraries/LibC/assert.cpp index 31145f26eb..75d40ef47d 100644 --- a/Userland/Libraries/LibC/assert.cpp +++ b/Userland/Libraries/LibC/assert.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -29,7 +30,7 @@ void __assertion_failed(char const* msg) { "assertion", strlen("assertion") }, { msg, strlen(msg) }, }; - syscall(SC_set_coredump_metadata, ¶ms); + syscall(SC_prctl, PR_SET_COREDUMP_METADATA_VALUE, ¶ms, nullptr); abort(); } }