Kernel: Pass a FileDescription to File::chmod() and File::chown()

We're going to make use of it in the next commit. But the idea is we want to
know how this File (more specifically, InodeFile) was opened in order to decide
how chown()/chmod() should behave, in particular whether it should be allowed or
not. Note that many other File operations, such as read(), write(), and ioctl(),
already require the caller to pass a FileDescription.
This commit is contained in:
Sergey Bugaev 2020-05-28 17:32:20 +03:00 committed by Andreas Kling
parent 67cbc015d5
commit a9946a99f2
Notes: sideshowbarker 2024-07-19 06:01:16 +09:00
6 changed files with 14 additions and 12 deletions

View file

@ -82,8 +82,8 @@ public:
virtual String absolute_path(const FileDescription&) const = 0; virtual String absolute_path(const FileDescription&) const = 0;
virtual KResult truncate(u64) { return KResult(-EINVAL); } virtual KResult truncate(u64) { return KResult(-EINVAL); }
virtual KResult chown(uid_t, gid_t) { return KResult(-EBADF); } virtual KResult chown(FileDescription&, uid_t, gid_t) { return KResult(-EBADF); }
virtual KResult chmod(mode_t) { return KResult(-EBADF); } virtual KResult chmod(FileDescription&, mode_t) { return KResult(-EBADF); }
virtual const char* class_name() const = 0; virtual const char* class_name() const = 0;

View file

@ -330,13 +330,13 @@ void FileDescription::set_file_flags(u32 flags)
KResult FileDescription::chmod(mode_t mode) KResult FileDescription::chmod(mode_t mode)
{ {
LOCKER(m_lock); LOCKER(m_lock);
return m_file->chmod(mode); return m_file->chmod(*this, mode);
} }
KResult FileDescription::chown(uid_t uid, gid_t gid) KResult FileDescription::chown(uid_t uid, gid_t gid)
{ {
LOCKER(m_lock); LOCKER(m_lock);
return m_file->chown(uid, gid); return m_file->chown(*this, uid, gid);
} }
} }

View file

@ -97,13 +97,15 @@ KResult InodeFile::truncate(u64 size)
return KSuccess; return KSuccess;
} }
KResult InodeFile::chown(uid_t uid, gid_t gid) KResult InodeFile::chown(FileDescription& description, uid_t uid, gid_t gid)
{ {
ASSERT(description.inode() == m_inode);
return VFS::the().chown(*m_inode, uid, gid); return VFS::the().chown(*m_inode, uid, gid);
} }
KResult InodeFile::chmod(mode_t mode) KResult InodeFile::chmod(FileDescription& description, mode_t mode)
{ {
ASSERT(description.inode() == m_inode);
return VFS::the().chmod(*m_inode, mode); return VFS::the().chmod(*m_inode, mode);
} }

View file

@ -54,8 +54,8 @@ public:
virtual String absolute_path(const FileDescription&) const override; virtual String absolute_path(const FileDescription&) const override;
virtual KResult truncate(u64) override; virtual KResult truncate(u64) override;
virtual KResult chown(uid_t, gid_t) override; virtual KResult chown(FileDescription&, uid_t, gid_t) override;
virtual KResult chmod(mode_t) override; virtual KResult chmod(FileDescription&, mode_t) override;
virtual const char* class_name() const override { return "InodeFile"; } virtual const char* class_name() const override { return "InodeFile"; }

View file

@ -375,7 +375,7 @@ KResult LocalSocket::getsockopt(FileDescription& description, int level, int opt
} }
} }
KResult LocalSocket::chmod(mode_t mode) KResult LocalSocket::chmod(FileDescription&, mode_t mode)
{ {
if (m_file) if (m_file)
return m_file->chmod(mode); return m_file->chmod(mode);
@ -384,7 +384,7 @@ KResult LocalSocket::chmod(mode_t mode)
return KSuccess; return KSuccess;
} }
KResult LocalSocket::chown(uid_t uid, gid_t gid) KResult LocalSocket::chown(FileDescription&, uid_t uid, gid_t gid)
{ {
if (m_file) if (m_file)
return m_file->chown(uid, gid); return m_file->chown(uid, gid);

View file

@ -60,8 +60,8 @@ public:
virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override; virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override; virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;
virtual KResult getsockopt(FileDescription&, int level, int option, void*, socklen_t*) override; virtual KResult getsockopt(FileDescription&, int level, int option, void*, socklen_t*) override;
virtual KResult chown(uid_t, gid_t) override; virtual KResult chown(FileDescription&, uid_t, gid_t) override;
virtual KResult chmod(mode_t) override; virtual KResult chmod(FileDescription&, mode_t) override;
private: private:
explicit LocalSocket(int type); explicit LocalSocket(int type);