diff --git a/Userland/Libraries/LibCore/Account.cpp b/Userland/Libraries/LibCore/Account.cpp index 4135028211..e2ab5eba2e 100644 --- a/Userland/Libraries/LibCore/Account.cpp +++ b/Userland/Libraries/LibCore/Account.cpp @@ -152,8 +152,8 @@ bool Account::authenticate(SecretString const& password) const ErrorOr Account::create_user_temporary_directory_if_needed() const { auto const temporary_directory = String::formatted("/tmp/user/{}", m_uid); - TRY(Core::Directory::create(temporary_directory, Core::Directory::CreateDirectories::Yes)); - TRY(Core::System::chown(temporary_directory, m_uid, m_gid)); + auto directory = TRY(Core::Directory::create(temporary_directory, Core::Directory::CreateDirectories::Yes)); + TRY(directory.chown(m_uid, m_gid)); return {}; } diff --git a/Userland/Libraries/LibCore/Directory.cpp b/Userland/Libraries/LibCore/Directory.cpp index e2e53d4944..f406399b94 100644 --- a/Userland/Libraries/LibCore/Directory.cpp +++ b/Userland/Libraries/LibCore/Directory.cpp @@ -31,6 +31,14 @@ Directory::~Directory() MUST(System::close(m_directory_fd)); } +ErrorOr Directory::chown(uid_t uid, gid_t gid) +{ + if (m_directory_fd == -1) + return Error::from_syscall("fchown"sv, -EBADF); + TRY(Core::System::fchown(m_directory_fd, uid, gid)); + return {}; +} + ErrorOr Directory::is_valid_directory(int fd) { auto stat = TRY(System::fstat(fd)); diff --git a/Userland/Libraries/LibCore/Directory.h b/Userland/Libraries/LibCore/Directory.h index 1405477bce..a2e567b376 100644 --- a/Userland/Libraries/LibCore/Directory.h +++ b/Userland/Libraries/LibCore/Directory.h @@ -43,6 +43,8 @@ public: ErrorOr path() const; + ErrorOr chown(uid_t, gid_t); + static ErrorOr is_valid_directory(int fd); private: