From d728017578c18ebcf6af9a6da8182ee15a597f75 Mon Sep 17 00:00:00 2001 From: gggggg-gggggg <88845056+gggggg-gggggg@users.noreply.github.com> Date: Sun, 3 Jul 2022 01:02:45 +0200 Subject: [PATCH] Kernel+LibC+LibCore: Pass fcntl extra argument as pointer-sized variable The extra argument to fcntl is a pointer in the case of F_GETLK/F_SETLK and we were pulling out a u32, leading to pointer truncation on x86_64. Among other things, this fixes Assistant on x86_64 :^) --- Kernel/Process.h | 2 +- Kernel/Syscalls/fcntl.cpp | 2 +- Userland/Libraries/LibC/fcntl.cpp | 2 +- Userland/Libraries/LibCore/System.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Kernel/Process.h b/Kernel/Process.h index d5d85b156d..2bfa038b96 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -349,7 +349,7 @@ public: ErrorOr sys$setresgid(GroupID, GroupID, GroupID); ErrorOr sys$alarm(unsigned seconds); ErrorOr sys$access(Userspace pathname, size_t path_length, int mode); - ErrorOr sys$fcntl(int fd, int cmd, u32 extra_arg); + ErrorOr sys$fcntl(int fd, int cmd, uintptr_t extra_arg); ErrorOr sys$ioctl(int fd, unsigned request, FlatPtr arg); ErrorOr sys$mkdir(Userspace pathname, size_t path_length, mode_t mode); ErrorOr sys$times(Userspace); diff --git a/Kernel/Syscalls/fcntl.cpp b/Kernel/Syscalls/fcntl.cpp index 80c0f39373..8b9d9b0a95 100644 --- a/Kernel/Syscalls/fcntl.cpp +++ b/Kernel/Syscalls/fcntl.cpp @@ -10,7 +10,7 @@ namespace Kernel { -ErrorOr Process::sys$fcntl(int fd, int cmd, u32 arg) +ErrorOr Process::sys$fcntl(int fd, int cmd, uintptr_t arg) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); TRY(require_promise(Pledge::stdio)); diff --git a/Userland/Libraries/LibC/fcntl.cpp b/Userland/Libraries/LibC/fcntl.cpp index 4a421178d0..e67a82d357 100644 --- a/Userland/Libraries/LibC/fcntl.cpp +++ b/Userland/Libraries/LibC/fcntl.cpp @@ -19,7 +19,7 @@ int fcntl(int fd, int cmd, ...) { va_list ap; va_start(ap, cmd); - u32 extra_arg = va_arg(ap, u32); + uintptr_t extra_arg = va_arg(ap, uintptr_t); int rc = syscall(SC_fcntl, fd, cmd, extra_arg); va_end(ap); __RETURN_WITH_ERRNO(rc, rc, -1); diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp index ea5ac7215c..bf48e871a8 100644 --- a/Userland/Libraries/LibCore/System.cpp +++ b/Userland/Libraries/LibCore/System.cpp @@ -248,7 +248,7 @@ ErrorOr fcntl(int fd, int command, ...) { va_list ap; va_start(ap, command); - u32 extra_arg = va_arg(ap, u32); + uintptr_t extra_arg = va_arg(ap, uintptr_t); int rc = ::fcntl(fd, command, extra_arg); va_end(ap); if (rc < 0)