1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:28:11 +00:00

Kernel: Move process coredump metadata modification to the prctl syscall

This commit is contained in:
Liav A 2023-03-01 21:28:51 +02:00 committed by Andreas Kling
parent 822164a686
commit be1d7c325a
8 changed files with 17 additions and 38 deletions

View file

@ -155,7 +155,6 @@ enum class NeedsBigProcessLock {
S(scheduler_set_parameters, NeedsBigProcessLock::No) \ S(scheduler_set_parameters, NeedsBigProcessLock::No) \
S(sendfd, NeedsBigProcessLock::No) \ S(sendfd, NeedsBigProcessLock::No) \
S(sendmsg, NeedsBigProcessLock::Yes) \ S(sendmsg, NeedsBigProcessLock::Yes) \
S(set_coredump_metadata, NeedsBigProcessLock::No) \
S(set_mmap_name, NeedsBigProcessLock::Yes) \ S(set_mmap_name, NeedsBigProcessLock::Yes) \
S(set_process_name, NeedsBigProcessLock::No) \ S(set_process_name, NeedsBigProcessLock::No) \
S(set_thread_name, NeedsBigProcessLock::No) \ S(set_thread_name, NeedsBigProcessLock::No) \

View file

@ -10,3 +10,4 @@
#define PR_GET_DUMPABLE 2 #define PR_GET_DUMPABLE 2
#define PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 3 #define PR_SET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 3
#define PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 4 #define PR_GET_NO_NEW_SYSCALL_REGION_ANNOTATIONS 4
#define PR_SET_COREDUMP_METADATA_VALUE 5

View file

@ -439,7 +439,6 @@ public:
ErrorOr<FlatPtr> sys$disown(ProcessID); ErrorOr<FlatPtr> sys$disown(ProcessID);
ErrorOr<FlatPtr> sys$allocate_tls(Userspace<char const*> initial_data, size_t); ErrorOr<FlatPtr> sys$allocate_tls(Userspace<char const*> initial_data, size_t);
ErrorOr<FlatPtr> sys$prctl(int option, FlatPtr arg1, FlatPtr arg2); ErrorOr<FlatPtr> sys$prctl(int option, FlatPtr arg1, FlatPtr arg2);
ErrorOr<FlatPtr> sys$set_coredump_metadata(Userspace<Syscall::SC_set_coredump_metadata_params const*>);
ErrorOr<FlatPtr> sys$anon_create(size_t, int options); ErrorOr<FlatPtr> sys$anon_create(size_t, int options);
ErrorOr<FlatPtr> sys$statvfs(Userspace<Syscall::SC_statvfs_params const*> user_params); ErrorOr<FlatPtr> sys$statvfs(Userspace<Syscall::SC_statvfs_params const*> user_params);
ErrorOr<FlatPtr> sys$fstatvfs(int fd, statvfs* buf); ErrorOr<FlatPtr> sys$fstatvfs(int fd, statvfs* buf);

View file

@ -25,7 +25,7 @@ ErrorOr<FlatPtr> Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] F
return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> { return address_space().with([&](auto& space) -> ErrorOr<FlatPtr> {
return space->enforces_syscall_regions(); 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) if (arg1 != 0 && arg1 != 1)
return EINVAL; return EINVAL;
bool prohibit_new_annotated_syscall_regions = (arg1 == 1); bool prohibit_new_annotated_syscall_regions = (arg1 == 1);
@ -38,6 +38,19 @@ ErrorOr<FlatPtr> Process::sys$prctl(int option, FlatPtr arg1, [[maybe_unused]] F
}); });
return 0; return 0;
} }
case PR_SET_COREDUMP_METADATA_VALUE: {
auto params = TRY(copy_typed_from_user<Syscall::SC_set_coredump_metadata_params>(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; return EINVAL;
}); });
} }

View file

@ -52,19 +52,4 @@ ErrorOr<FlatPtr> Process::sys$set_process_name(Userspace<char const*> user_name,
return 0; return 0;
} }
ErrorOr<FlatPtr> Process::sys$set_coredump_metadata(Userspace<Syscall::SC_set_coredump_metadata_params const*> 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;
}
} }

View file

@ -225,7 +225,6 @@ private:
int virt$scheduler_set_parameters(FlatPtr); int virt$scheduler_set_parameters(FlatPtr);
int virt$sendfd(int, int); int virt$sendfd(int, int);
int virt$sendmsg(int sockfd, FlatPtr msg_addr, int flags); 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_mmap_name(FlatPtr);
int virt$set_process_name(FlatPtr buffer, int size); int virt$set_process_name(FlatPtr buffer, int size);
int virt$set_thread_name(pid_t, FlatPtr, size_t); int virt$set_thread_name(pid_t, FlatPtr, size_t);

View file

@ -208,8 +208,6 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
return virt$sendfd(arg1, arg2); return virt$sendfd(arg1, arg2);
case SC_sendmsg: case SC_sendmsg:
return virt$sendmsg(arg1, arg2, arg3); return virt$sendmsg(arg1, arg2, arg3);
case SC_set_coredump_metadata:
return virt$set_coredump_metadata(arg1);
case SC_set_mmap_name: case SC_set_mmap_name:
return virt$set_mmap_name(arg1); return virt$set_mmap_name(arg1);
case SC_set_process_name: case SC_set_process_name:
@ -397,22 +395,6 @@ int Emulator::virt$rename(FlatPtr params_addr)
return syscall(SC_rename, &params); return syscall(SC_rename, &params);
} }
int Emulator::virt$set_coredump_metadata(FlatPtr params_addr)
{
Syscall::SC_set_coredump_metadata_params params;
mmu().copy_from_vm(&params, 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, &params);
}
int Emulator::virt$dbgputstr(FlatPtr characters, int length) int Emulator::virt$dbgputstr(FlatPtr characters, int length)
{ {
auto buffer = mmu().copy_buffer_from_vm(characters, length); auto buffer = mmu().copy_buffer_from_vm(characters, length);

View file

@ -5,6 +5,7 @@
*/ */
#include <AK/Format.h> #include <AK/Format.h>
#include <Kernel/API/prctl_numbers.h>
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -29,7 +30,7 @@ void __assertion_failed(char const* msg)
{ "assertion", strlen("assertion") }, { "assertion", strlen("assertion") },
{ msg, strlen(msg) }, { msg, strlen(msg) },
}; };
syscall(SC_set_coredump_metadata, &params); syscall(SC_prctl, PR_SET_COREDUMP_METADATA_VALUE, &params, nullptr);
abort(); abort();
} }
} }