mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 19:38:12 +00:00
Kernel: Move process coredump metadata modification to the prctl syscall
This commit is contained in:
parent
822164a686
commit
be1d7c325a
8 changed files with 17 additions and 38 deletions
|
@ -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) \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -439,7 +439,6 @@ public:
|
|||
ErrorOr<FlatPtr> sys$disown(ProcessID);
|
||||
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$set_coredump_metadata(Userspace<Syscall::SC_set_coredump_metadata_params const*>);
|
||||
ErrorOr<FlatPtr> sys$anon_create(size_t, int options);
|
||||
ErrorOr<FlatPtr> sys$statvfs(Userspace<Syscall::SC_statvfs_params const*> user_params);
|
||||
ErrorOr<FlatPtr> sys$fstatvfs(int fd, statvfs* buf);
|
||||
|
|
|
@ -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 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<FlatPtr> 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<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;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -52,19 +52,4 @@ ErrorOr<FlatPtr> Process::sys$set_process_name(Userspace<char const*> user_name,
|
|||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <AK/Format.h>
|
||||
#include <Kernel/API/prctl_numbers.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue