diff options
author | Andreas Kling <kling@serenityos.org> | 2023-04-03 15:59:10 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2023-04-04 10:33:42 +0200 |
commit | 97ac4601f5dca698550c5080cc8eb163ba01711d (patch) | |
tree | dd910b369b515c3ace5d6165f60132714f4da95b /Kernel | |
parent | f0c9c5e076711bcec8db6f091f577d6fac7bede3 (diff) | |
download | serenity-97ac4601f5dca698550c5080cc8eb163ba01711d.zip |
Kernel: Use custody_for_dirfd() in more syscalls
This simplifies a lot of syscalls, some of which were doing very
unnecessarily verbose things instead of calling this.
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/Syscalls/chmod.cpp | 12 | ||||
-rw-r--r-- | Kernel/Syscalls/chown.cpp | 12 | ||||
-rw-r--r-- | Kernel/Syscalls/open.cpp | 13 | ||||
-rw-r--r-- | Kernel/Syscalls/stat.cpp | 13 | ||||
-rw-r--r-- | Kernel/Syscalls/unlink.cpp | 10 | ||||
-rw-r--r-- | Kernel/Syscalls/utimensat.cpp | 34 |
6 files changed, 7 insertions, 87 deletions
diff --git a/Kernel/Syscalls/chmod.cpp b/Kernel/Syscalls/chmod.cpp index 76350c8889..e5ddc1530f 100644 --- a/Kernel/Syscalls/chmod.cpp +++ b/Kernel/Syscalls/chmod.cpp @@ -17,17 +17,7 @@ ErrorOr<FlatPtr> Process::sys$chmod(Userspace<Syscall::SC_chmod_params const*> u TRY(require_promise(Pledge::fattr)); auto params = TRY(copy_typed_from_user(user_params)); auto path = TRY(get_syscall_path_argument(params.path)); - - RefPtr<Custody> base; - if (params.dirfd == AT_FDCWD) { - base = current_directory(); - } else { - auto base_description = TRY(open_file_description(params.dirfd)); - if (!base_description->custody()) - return EINVAL; - base = base_description->custody(); - } - + auto base = TRY(custody_for_dirfd(params.dirfd)); TRY(VirtualFileSystem::the().chmod(credentials(), path->view(), params.mode, *base, params.follow_symlinks ? 0 : O_NOFOLLOW_NOERROR)); return 0; } diff --git a/Kernel/Syscalls/chown.cpp b/Kernel/Syscalls/chown.cpp index 69d2934a35..6616ed7999 100644 --- a/Kernel/Syscalls/chown.cpp +++ b/Kernel/Syscalls/chown.cpp @@ -27,17 +27,7 @@ ErrorOr<FlatPtr> Process::sys$chown(Userspace<Syscall::SC_chown_params const*> u TRY(require_promise(Pledge::chown)); auto params = TRY(copy_typed_from_user(user_params)); auto path = TRY(get_syscall_path_argument(params.path)); - - RefPtr<Custody> base; - if (params.dirfd == AT_FDCWD) { - base = current_directory(); - } else { - auto base_description = TRY(open_file_description(params.dirfd)); - if (!base_description->custody()) - return EINVAL; - base = base_description->custody(); - } - + auto base = TRY(custody_for_dirfd(params.dirfd)); TRY(VirtualFileSystem::the().chown(credentials(), path->view(), params.uid, params.gid, *base, params.follow_symlinks ? 0 : O_NOFOLLOW_NOERROR)); return 0; } diff --git a/Kernel/Syscalls/open.cpp b/Kernel/Syscalls/open.cpp index 59f7af709e..740d5255cd 100644 --- a/Kernel/Syscalls/open.cpp +++ b/Kernel/Syscalls/open.cpp @@ -55,18 +55,7 @@ ErrorOr<FlatPtr> Process::sys$open(Userspace<Syscall::SC_open_params const*> use dbgln_if(IO_DEBUG, "sys$open(dirfd={}, path='{}', options={}, mode={})", dirfd, path->view(), options, mode); auto fd_allocation = TRY(allocate_fd()); - RefPtr<Custody> base; - if (dirfd == AT_FDCWD) { - base = current_directory(); - } else { - auto base_description = TRY(open_file_description(dirfd)); - if (!base_description->is_directory()) - return ENOTDIR; - if (!base_description->custody()) - return EINVAL; - base = base_description->custody(); - } - + auto base = TRY(custody_for_dirfd(dirfd)); auto description = TRY(VirtualFileSystem::the().open(credentials(), path->view(), options, mode & ~umask(), *base)); if (description->inode() && description->inode()->bound_socket()) diff --git a/Kernel/Syscalls/stat.cpp b/Kernel/Syscalls/stat.cpp index f2ceeb215b..7299241743 100644 --- a/Kernel/Syscalls/stat.cpp +++ b/Kernel/Syscalls/stat.cpp @@ -28,18 +28,7 @@ ErrorOr<FlatPtr> Process::sys$stat(Userspace<Syscall::SC_stat_params const*> use auto params = TRY(copy_typed_from_user(user_params)); auto path = TRY(get_syscall_path_argument(params.path)); - - RefPtr<Custody> base; - if (params.dirfd == AT_FDCWD) { - base = current_directory(); - } else { - auto base_description = TRY(open_file_description(params.dirfd)); - if (!base_description->is_directory()) - return ENOTDIR; - if (!base_description->custody()) - return EINVAL; - base = base_description->custody(); - } + auto base = TRY(custody_for_dirfd(params.dirfd)); auto metadata = TRY(VirtualFileSystem::the().lookup_metadata(credentials(), path->view(), *base, params.follow_symlinks ? 0 : O_NOFOLLOW_NOERROR)); auto statbuf = TRY(metadata.stat()); TRY(copy_to_user(params.statbuf, &statbuf)); diff --git a/Kernel/Syscalls/unlink.cpp b/Kernel/Syscalls/unlink.cpp index d545e4ce0b..90a73bdf3e 100644 --- a/Kernel/Syscalls/unlink.cpp +++ b/Kernel/Syscalls/unlink.cpp @@ -19,15 +19,7 @@ ErrorOr<FlatPtr> Process::sys$unlink(int dirfd, Userspace<char const*> user_path if (flags & ~AT_REMOVEDIR) return Error::from_errno(EINVAL); - RefPtr<Custody> base; - if (dirfd == AT_FDCWD) { - base = current_directory(); - } else { - auto base_description = TRY(open_file_description(dirfd)); - if (!base_description->custody()) - return Error::from_errno(EINVAL); - base = base_description->custody(); - } + auto base = TRY(custody_for_dirfd(dirfd)); if (flags & AT_REMOVEDIR) TRY(VirtualFileSystem::the().rmdir(credentials(), path->view(), *base)); diff --git a/Kernel/Syscalls/utimensat.cpp b/Kernel/Syscalls/utimensat.cpp index 4ab0bb600a..14319ab84d 100644 --- a/Kernel/Syscalls/utimensat.cpp +++ b/Kernel/Syscalls/utimensat.cpp @@ -19,8 +19,6 @@ ErrorOr<FlatPtr> Process::sys$utimensat(Userspace<Syscall::SC_utimensat_params c auto params = TRY(copy_typed_from_user(user_params)); auto now = kgettimeofday().to_timespec(); - - int dirfd = params.dirfd; int follow_symlink = params.flag & AT_SYMLINK_NOFOLLOW ? O_NOFOLLOW_NOERROR : 0; timespec times[2]; @@ -37,36 +35,8 @@ ErrorOr<FlatPtr> Process::sys$utimensat(Userspace<Syscall::SC_utimensat_params c times[1] = now; } - OwnPtr<KString> path; - RefPtr<OpenFileDescription> description; - RefPtr<Custody> base; - - auto path_or_error = get_syscall_path_argument(params.path); - if (path_or_error.is_error()) { - // If the path is empty ("") but not a nullptr, attempt to get a path - // from the file descriptor. This allows futimens() to be implemented - // in terms of utimensat(). - if (params.path.characters && params.path.length == 0) { - description = TRY(open_file_description(dirfd)); - path = TRY(description->original_absolute_path()); - base = description->custody(); - } else { - return path_or_error.release_error(); - } - } else { - path = path_or_error.release_value(); - if (dirfd == AT_FDCWD) { - base = current_directory(); - } else { - description = TRY(open_file_description(dirfd)); - if (!KLexicalPath::is_absolute(path->view()) && !description->is_directory()) - return ENOTDIR; - if (!description->custody()) - return EINVAL; - base = description->custody(); - } - } - + auto path = TRY(get_syscall_path_argument(params.path)); + auto base = TRY(custody_for_dirfd(params.dirfd)); auto& atime = times[0]; auto& mtime = times[1]; TRY(VirtualFileSystem::the().utimensat(credentials(), path->view(), *base, atime, mtime, follow_symlink)); |