diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 5dfa8cda27..fec53383e0 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1444,12 +1444,12 @@ int Process::sys$utime(const char* pathname, const utimbuf* buf) return VFS::the().utime(StringView(pathname), current_directory(), atime, mtime); } -int Process::sys$access(const char* pathname, int mode) +int Process::sys$access(const char* user_path, size_t path_length, int mode) { - SmapDisabler disabler; - if (!validate_read_str(pathname)) + if (!validate_read_str(user_path)) return -EFAULT; - return VFS::the().access(StringView(pathname), mode, current_directory()); + auto path = copy_string_from_user(user_path, path_length); + return VFS::the().access(path, mode, current_directory()); } int Process::sys$fcntl(int fd, int cmd, u32 arg) diff --git a/Kernel/Process.h b/Kernel/Process.h index 001f1c0c8c..70a1e39326 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -171,7 +171,7 @@ public: int sys$setgid(gid_t); int sys$setuid(uid_t); unsigned sys$alarm(unsigned seconds); - int sys$access(const char* pathname, int mode); + int sys$access(const char* pathname, size_t path_length, int mode); int sys$fcntl(int fd, int cmd, u32 extra_arg); int sys$ioctl(int fd, unsigned request, unsigned arg); int sys$mkdir(const char* pathname, mode_t mode); diff --git a/Libraries/LibC/unistd.cpp b/Libraries/LibC/unistd.cpp index e1cfde0463..8c0f093f3f 100644 --- a/Libraries/LibC/unistd.cpp +++ b/Libraries/LibC/unistd.cpp @@ -389,7 +389,11 @@ int setgid(uid_t gid) int access(const char* pathname, int mode) { - int rc = syscall(SC_access, pathname, mode); + if (!pathname) { + errno = EFAULT; + return -1; + } + int rc = syscall(SC_access, pathname, strlen(pathname), mode); __RETURN_WITH_ERRNO(rc, rc, -1); }