diff --git a/Kernel/Syscalls/chown.cpp b/Kernel/Syscalls/chown.cpp index 42ef00d179..5c0803bea3 100644 --- a/Kernel/Syscalls/chown.cpp +++ b/Kernel/Syscalls/chown.cpp @@ -23,8 +23,8 @@ KResultOr Process::sys$chown(Userspace { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); REQUIRE_PROMISE(chown); - Syscall::SC_chown_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); + auto path = TRY(get_syscall_path_argument(params.path)); return VirtualFileSystem::the().chown(path->view(), params.uid, params.gid, current_directory()); } diff --git a/Kernel/Syscalls/clock.cpp b/Kernel/Syscalls/clock.cpp index 001e9e79a9..2dbfa0539c 100644 --- a/Kernel/Syscalls/clock.cpp +++ b/Kernel/Syscalls/clock.cpp @@ -66,9 +66,7 @@ KResultOr Process::sys$clock_nanosleep(Userspace requested_sleep = copy_time_from_user(params.requested_sleep); if (!requested_sleep.has_value()) diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index 045f35bb86..2f23242204 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -939,8 +939,7 @@ KResultOr Process::sys$execve(Userspace ARG_MAX || params.environment.length > ARG_MAX) return E2BIG; diff --git a/Kernel/Syscalls/futex.cpp b/Kernel/Syscalls/futex.cpp index 3856e19591..308c284b45 100644 --- a/Kernel/Syscalls/futex.cpp +++ b/Kernel/Syscalls/futex.cpp @@ -25,8 +25,7 @@ void Process::clear_futex_queues_on_exec() KResultOr Process::sys$futex(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); - Syscall::SC_futex_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); Thread::BlockTimeout timeout; u32 cmd = params.futex_op & FUTEX_CMD_MASK; diff --git a/Kernel/Syscalls/inode_watcher.cpp b/Kernel/Syscalls/inode_watcher.cpp index b7eab37ede..9623634df3 100644 --- a/Kernel/Syscalls/inode_watcher.cpp +++ b/Kernel/Syscalls/inode_watcher.cpp @@ -46,9 +46,7 @@ KResultOr Process::sys$inode_watcher_add_watch(Userspace Process::sys$setkeymap(Userspace Process::sys$getkeymap(Userspace Process::sys$link(Userspace u { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(cpath); - Syscall::SC_link_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); auto old_path = TRY(try_copy_kstring_from_user(params.old_path)); auto new_path = TRY(try_copy_kstring_from_user(params.new_path)); return VirtualFileSystem::the().link(old_path->view(), new_path->view(), current_directory()); @@ -25,8 +24,8 @@ KResultOr Process::sys$symlink(Userspaceview(), linkpath->view(), current_directory()); diff --git a/Kernel/Syscalls/mknod.cpp b/Kernel/Syscalls/mknod.cpp index df924a26be..4a646b7638 100644 --- a/Kernel/Syscalls/mknod.cpp +++ b/Kernel/Syscalls/mknod.cpp @@ -14,8 +14,8 @@ KResultOr Process::sys$mknod(Userspace { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(dpath); - Syscall::SC_mknod_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); + if (!is_superuser() && !is_regular_file(params.mode) && !is_fifo(params.mode) && !is_socket(params.mode)) return EPERM; auto path = TRY(get_syscall_path_argument(params.path)); diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 4f69afc718..2817b69bb5 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -128,9 +128,7 @@ KResultOr Process::sys$mmap(Userspace u { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(stdio); - - Syscall::SC_mmap_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); FlatPtr addr = params.addr; auto size = params.size; @@ -467,9 +465,7 @@ KResultOr Process::sys$set_mmap_name(Userspace PATH_MAX) return ENAMETOOLONG; @@ -504,9 +500,7 @@ KResultOr Process::sys$mremap(Userspace Process::sys$mount(Userspace return EPERM; REQUIRE_NO_PROMISES; - - Syscall::SC_mount_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); auto source_fd = params.source_fd; auto target_or_error = try_copy_kstring_from_user(params.target); diff --git a/Kernel/Syscalls/open.cpp b/Kernel/Syscalls/open.cpp index 00593129e4..86775e436c 100644 --- a/Kernel/Syscalls/open.cpp +++ b/Kernel/Syscalls/open.cpp @@ -14,8 +14,7 @@ namespace Kernel { KResultOr Process::sys$open(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_open_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); int dirfd = params.dirfd; int options = params.options; diff --git a/Kernel/Syscalls/pledge.cpp b/Kernel/Syscalls/pledge.cpp index 0b94bf2b91..2354d575f6 100644 --- a/Kernel/Syscalls/pledge.cpp +++ b/Kernel/Syscalls/pledge.cpp @@ -12,8 +12,7 @@ namespace Kernel { KResultOr Process::sys$pledge(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_pledge_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); if (params.promises.length > 1024 || params.execpromises.length > 1024) return E2BIG; diff --git a/Kernel/Syscalls/process.cpp b/Kernel/Syscalls/process.cpp index 1aac87e459..4832dcaf5c 100644 --- a/Kernel/Syscalls/process.cpp +++ b/Kernel/Syscalls/process.cpp @@ -53,8 +53,8 @@ KResultOr Process::sys$set_process_name(Userspace user_nam KResultOr Process::sys$set_coredump_metadata(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_set_coredump_metadata_params params; - TRY(copy_from_user(¶ms, user_params)); + 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) diff --git a/Kernel/Syscalls/ptrace.cpp b/Kernel/Syscalls/ptrace.cpp index ba491879a2..77854351ee 100644 --- a/Kernel/Syscalls/ptrace.cpp +++ b/Kernel/Syscalls/ptrace.cpp @@ -148,8 +148,8 @@ KResultOr Process::sys$ptrace(Userspace Process::sys$readlink(Userspace Process::sys$realpath(Userspace Process::sys$rename(Userspace Process::sys$select(Userspace Process::sys$poll(Userspace u { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(stdio); - - Syscall::SC_poll_params params {}; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); if (params.nfds >= fds().max_open()) return ENOBUFS; diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index 5d7174679d..179562784d 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -79,9 +79,7 @@ KResultOr Process::sys$accept4(Userspace user_address((FlatPtr)params.addr); @@ -307,24 +305,21 @@ KResult Process::get_sock_or_peer_name(const Params& params) KResultOr Process::sys$getsockname(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_getsockname_params params = {}; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); return get_sock_or_peer_name(params); } KResultOr Process::sys$getpeername(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_getpeername_params params = {}; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); return get_sock_or_peer_name(params); } KResultOr Process::sys$getsockopt(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_getsockopt_params params = {}; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); int sockfd = params.sockfd; int level = params.level; @@ -349,8 +344,8 @@ KResultOr Process::sys$getsockopt(Userspace Process::sys$setsockopt(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_setsockopt_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); + Userspace user_value((FlatPtr)params.value); auto description = fds().file_description(params.sockfd); if (!description) @@ -365,8 +360,7 @@ KResultOr Process::sys$setsockopt(Userspace Process::sys$socketpair(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_socketpair_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); if (params.domain != AF_LOCAL) return EINVAL; diff --git a/Kernel/Syscalls/stat.cpp b/Kernel/Syscalls/stat.cpp index 908213b297..262f5bc22e 100644 --- a/Kernel/Syscalls/stat.cpp +++ b/Kernel/Syscalls/stat.cpp @@ -27,8 +27,8 @@ KResultOr Process::sys$stat(Userspace u { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) REQUIRE_PROMISE(rpath); - Syscall::SC_stat_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); + auto path = get_syscall_path_argument(params.path); if (path.is_error()) return path.error(); diff --git a/Kernel/Syscalls/statvfs.cpp b/Kernel/Syscalls/statvfs.cpp index 14020e7f72..08ba9a8984 100644 --- a/Kernel/Syscalls/statvfs.cpp +++ b/Kernel/Syscalls/statvfs.cpp @@ -69,9 +69,8 @@ KResultOr Process::sys$statvfs(Userspace Process::sys$create_thread(void* (*entry)(void*), Userspace Process::sys$unveil(Userspace user_params) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this) - Syscall::SC_unveil_params params; - TRY(copy_from_user(¶ms, user_params)); + auto params = TRY(copy_typed_from_user(user_params)); if (!params.path.characters && !params.permissions.characters) { m_veil_state = VeilState::Locked; diff --git a/Kernel/Syscalls/waitid.cpp b/Kernel/Syscalls/waitid.cpp index 2592da8c12..350f95b1c1 100644 --- a/Kernel/Syscalls/waitid.cpp +++ b/Kernel/Syscalls/waitid.cpp @@ -23,9 +23,7 @@ KResultOr Process::sys$waitid(Userspace, NonnullRefPtr> waitee = Empty {}; switch (params.idtype) {