diff --git a/Kernel/FileSystem/FileDescriptor.cpp b/Kernel/FileSystem/FileDescriptor.cpp index 1f2f0dec317..b807df44fd4 100644 --- a/Kernel/FileSystem/FileDescriptor.cpp +++ b/Kernel/FileSystem/FileDescriptor.cpp @@ -329,5 +329,5 @@ KResult FileDescriptor::chown(uid_t uid, gid_t gid) { if (!m_inode) return KResult(-EINVAL); - return m_inode->chown(uid, gid); + return VFS::the().chown(*m_inode, uid, gid); } diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 820ad65def0..fca73d47285 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -402,14 +402,8 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base) return KSuccess; } -KResult VFS::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base) +KResult VFS::chown(Inode& inode, uid_t a_uid, gid_t a_gid) { - auto custody_or_error = resolve_path(path, base); - if (custody_or_error.is_error()) - return custody_or_error.error(); - auto& custody = *custody_or_error.value(); - auto& inode = custody.inode(); - if (inode.fs().is_readonly()) return KResult(-EROFS); @@ -436,6 +430,16 @@ KResult VFS::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base) return inode.chown(new_uid, new_gid); } +KResult VFS::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base) +{ + auto custody_or_error = resolve_path(path, base); + if (custody_or_error.is_error()) + return custody_or_error.error(); + auto& custody = *custody_or_error.value(); + auto& inode = custody.inode(); + return chown(inode, a_uid, a_gid); +} + KResult VFS::link(StringView old_path, StringView new_path, Custody& base) { auto old_custody_or_error = resolve_path(old_path, base); diff --git a/Kernel/FileSystem/VirtualFileSystem.h b/Kernel/FileSystem/VirtualFileSystem.h index 238a2cff030..548d860fa3c 100644 --- a/Kernel/FileSystem/VirtualFileSystem.h +++ b/Kernel/FileSystem/VirtualFileSystem.h @@ -70,6 +70,7 @@ public: KResult chmod(StringView path, mode_t, Custody& base); KResult fchmod(Inode&, mode_t); KResult chown(StringView path, uid_t, gid_t, Custody& base); + KResult chown(Inode&, uid_t, gid_t); KResult access(StringView path, int mode, Custody& base); KResult stat(StringView path, int options, Custody& base, struct stat&); KResult utime(StringView path, Custody& base, time_t atime, time_t mtime);