diff --git a/Kernel/CharacterDevice.h b/Kernel/CharacterDevice.h index 179a739e1d..f9299b1a82 100644 --- a/Kernel/CharacterDevice.h +++ b/Kernel/CharacterDevice.h @@ -32,10 +32,17 @@ public: virtual const char* class_name() const = 0; + uid_t uid() const { return m_uid; } + uid_t gid() const { return m_gid; } + protected: CharacterDevice(unsigned major, unsigned minor) : m_major(major), m_minor(minor) { } + void set_uid(uid_t uid) { m_uid = uid; } + void set_gid(gid_t gid) { m_gid = gid; } private: unsigned m_major { 0 }; unsigned m_minor { 0 }; + uid_t m_uid { 0 }; + gid_t m_gid { 0 }; }; diff --git a/Kernel/DevPtsFS.cpp b/Kernel/DevPtsFS.cpp index 4deaac06e7..4754b3673f 100644 --- a/Kernel/DevPtsFS.cpp +++ b/Kernel/DevPtsFS.cpp @@ -44,12 +44,15 @@ RetainPtr DevPtsFS::create_slave_pty_device_file(unsigned index) builder.appendf("%u", index); file->m_name = builder.build(); + auto* device = VFS::the().get_device(11, index); + ASSERT(device); + file->m_metadata.size = 0; - file->m_metadata.uid = 0; - file->m_metadata.gid = 0; - file->m_metadata.mode = 0020666; - file->m_metadata.majorDevice = 11; - file->m_metadata.minorDevice = index; + file->m_metadata.uid = device->uid(); + file->m_metadata.gid = device->gid(); + file->m_metadata.mode = 0020644; + file->m_metadata.majorDevice = device->major(); + file->m_metadata.minorDevice = device->minor(); file->m_metadata.mtime = mepoch; return file; } diff --git a/Kernel/MasterPTY.cpp b/Kernel/MasterPTY.cpp index 7f0e8d966e..f1a88103d3 100644 --- a/Kernel/MasterPTY.cpp +++ b/Kernel/MasterPTY.cpp @@ -1,6 +1,7 @@ #include "MasterPTY.h" #include "SlavePTY.h" #include "PTYMultiplexer.h" +#include #include MasterPTY::MasterPTY(unsigned index) @@ -8,6 +9,8 @@ MasterPTY::MasterPTY(unsigned index) , m_slave(adopt(*new SlavePTY(*this, index))) , m_index(index) { + set_uid(current->uid()); + set_gid(current->gid()); } MasterPTY::~MasterPTY() diff --git a/Kernel/PTYMultiplexer.cpp b/Kernel/PTYMultiplexer.cpp index 9d2a13e45b..15959e1b3f 100644 --- a/Kernel/PTYMultiplexer.cpp +++ b/Kernel/PTYMultiplexer.cpp @@ -1,5 +1,6 @@ #include "PTYMultiplexer.h" #include "MasterPTY.h" +#include #include static const unsigned s_max_pty_pairs = 8; diff --git a/Kernel/SlavePTY.cpp b/Kernel/SlavePTY.cpp index 43c9e00df4..f5c0b1872a 100644 --- a/Kernel/SlavePTY.cpp +++ b/Kernel/SlavePTY.cpp @@ -1,12 +1,15 @@ #include "SlavePTY.h" #include "MasterPTY.h" #include "DevPtsFS.h" +#include SlavePTY::SlavePTY(MasterPTY& master, unsigned index) : TTY(11, index) , m_master(master) , m_index(index) { + set_uid(current->uid()); + set_gid(current->gid()); VFS::the().register_character_device(*this); DevPtsFS::the().register_slave_pty(*this); set_size(80, 25); diff --git a/Kernel/VirtualFileSystem.cpp b/Kernel/VirtualFileSystem.cpp index c2200f0792..88ccca1add 100644 --- a/Kernel/VirtualFileSystem.cpp +++ b/Kernel/VirtualFileSystem.cpp @@ -517,6 +517,14 @@ void VFS::unregister_character_device(CharacterDevice& device) m_character_devices.remove(encodedDevice(device.major(), device.minor())); } +CharacterDevice* VFS::get_device(unsigned major, unsigned minor) +{ + auto it = m_character_devices.find(encodedDevice(major, minor)); + if (it == m_character_devices.end()) + return nullptr; + return (*it).value; +} + void VFS::for_each_mount(Function callback) const { for (auto& mount : m_mounts) { diff --git a/Kernel/VirtualFileSystem.h b/Kernel/VirtualFileSystem.h index 3bd677943f..fa171f4c15 100644 --- a/Kernel/VirtualFileSystem.h +++ b/Kernel/VirtualFileSystem.h @@ -86,6 +86,8 @@ public: void sync(); + CharacterDevice* get_device(unsigned major, unsigned minor); + private: friend class FileDescriptor;