mirror of
https://github.com/RGBCube/serenity
synced 2025-06-30 10:22:13 +00:00
Kernel: Strongly typed user & group ID's
Prior to this change, both uid_t and gid_t were typedef'ed to `u32`. This made it easy to use them interchangeably. Let's not allow that. This patch adds UserID and GroupID using the AK::DistinctNumeric mechanism we've already been employing for pid_t/ProcessID.
This commit is contained in:
parent
59335bd8ea
commit
ae197deb6b
44 changed files with 172 additions and 169 deletions
|
@ -34,8 +34,8 @@ public:
|
||||||
virtual String absolute_path(const FileDescription&) const override;
|
virtual String absolute_path(const FileDescription&) const override;
|
||||||
virtual String absolute_path() const;
|
virtual String absolute_path() const;
|
||||||
|
|
||||||
uid_t uid() const { return m_uid; }
|
UserID uid() const { return m_uid; }
|
||||||
uid_t gid() const { return m_gid; }
|
GroupID gid() const { return m_gid; }
|
||||||
|
|
||||||
virtual mode_t required_mode() const = 0;
|
virtual mode_t required_mode() const = 0;
|
||||||
virtual String device_name() const = 0;
|
virtual String device_name() const = 0;
|
||||||
|
@ -62,16 +62,16 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Device(unsigned major, unsigned minor);
|
Device(unsigned major, unsigned minor);
|
||||||
void set_uid(uid_t uid) { m_uid = uid; }
|
void set_uid(UserID uid) { m_uid = uid; }
|
||||||
void set_gid(gid_t gid) { m_gid = gid; }
|
void set_gid(GroupID gid) { m_gid = gid; }
|
||||||
|
|
||||||
static HashMap<u32, Device*>& all_devices();
|
static HashMap<u32, Device*>& all_devices();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned m_major { 0 };
|
unsigned m_major { 0 };
|
||||||
unsigned m_minor { 0 };
|
unsigned m_minor { 0 };
|
||||||
uid_t m_uid { 0 };
|
UserID m_uid { 0 };
|
||||||
gid_t m_gid { 0 };
|
GroupID m_gid { 0 };
|
||||||
|
|
||||||
Spinlock<u8> m_requests_lock;
|
Spinlock<u8> m_requests_lock;
|
||||||
DoublyLinkedList<RefPtr<AsyncDeviceRequest>> m_requests;
|
DoublyLinkedList<RefPtr<AsyncDeviceRequest>> m_requests;
|
||||||
|
|
|
@ -107,7 +107,7 @@ KResultOr<size_t> DevFSInode::write_bytes(off_t, size_t, const UserOrKernelBuffe
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> DevFSInode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> DevFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ KResult DevFSInode::chmod(mode_t)
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult DevFSInode::chown(uid_t, gid_t)
|
KResult DevFSInode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
@ -253,7 +253,7 @@ KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::lookup(StringView name)
|
||||||
}
|
}
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(StringView name, mode_t mode, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> DevFSRootDirectoryInode::create_child(StringView name, mode_t mode, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
MutexLocker locker(fs().m_lock);
|
MutexLocker locker(fs().m_lock);
|
||||||
|
|
||||||
|
@ -325,7 +325,7 @@ DevFSDeviceInode::~DevFSDeviceInode()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult DevFSDeviceInode::chown(uid_t uid, gid_t gid)
|
KResult DevFSDeviceInode::chown(UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_inode_lock);
|
MutexLocker locker(m_inode_lock);
|
||||||
m_uid = uid;
|
m_uid = uid;
|
||||||
|
|
|
@ -58,11 +58,11 @@ protected:
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -80,13 +80,13 @@ private:
|
||||||
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
virtual KResultOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, FileDescription*) const override;
|
||||||
virtual InodeMetadata metadata() const override;
|
virtual InodeMetadata metadata() const override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
|
|
||||||
NonnullRefPtr<Device> m_attached_device;
|
NonnullRefPtr<Device> m_attached_device;
|
||||||
NonnullOwnPtr<KString> m_name;
|
NonnullOwnPtr<KString> m_name;
|
||||||
|
|
||||||
uid_t m_uid { 0 };
|
UserID m_uid { 0 };
|
||||||
gid_t m_gid { 0 };
|
GroupID m_gid { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
class DevFSLinkInode : public DevFSInode {
|
class DevFSLinkInode : public DevFSInode {
|
||||||
|
@ -147,7 +147,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit DevFSRootDirectoryInode(DevFS&);
|
explicit DevFSRootDirectoryInode(DevFS&);
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual InodeMetadata metadata() const override;
|
virtual InodeMetadata metadata() const override;
|
||||||
|
|
|
@ -160,7 +160,7 @@ KResult DevPtsFSInode::add_child(Inode&, const StringView&, mode_t)
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> DevPtsFSInode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> DevPtsFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ KResult DevPtsFSInode::chmod(mode_t)
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult DevPtsFSInode::chown(uid_t, gid_t)
|
KResult DevPtsFSInode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,11 +53,11 @@ private:
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
|
|
||||||
WeakPtr<SlavePTY> m_pty;
|
WeakPtr<SlavePTY> m_pty;
|
||||||
InodeMetadata m_metadata;
|
InodeMetadata m_metadata;
|
||||||
|
|
|
@ -1176,7 +1176,7 @@ KResult Ext2FSInode::write_directory(Vector<Ext2FSDirectoryEntry>& entries)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> Ext2FSInode::create_child(StringView name, mode_t mode, dev_t dev, uid_t uid, gid_t gid)
|
KResultOr<NonnullRefPtr<Inode>> Ext2FSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
if (::is_directory(mode))
|
if (::is_directory(mode))
|
||||||
return fs().create_directory(*this, name, mode, uid, gid);
|
return fs().create_directory(*this, name, mode, uid, gid);
|
||||||
|
@ -1539,7 +1539,7 @@ KResult Ext2FS::set_block_allocation_state(BlockIndex block_index, bool new_stat
|
||||||
return update_bitmap_block(bgd.bg_block_bitmap, bit_index, new_state, m_super_block.s_free_blocks_count, bgd.bg_free_blocks_count);
|
return update_bitmap_block(bgd.bg_block_bitmap, bit_index, new_state, m_super_block.s_free_blocks_count, bgd.bg_free_blocks_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FS::create_directory(Ext2FSInode& parent_inode, const String& name, mode_t mode, uid_t uid, gid_t gid)
|
KResult Ext2FS::create_directory(Ext2FSInode& parent_inode, const String& name, mode_t mode, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_lock);
|
MutexLocker locker(m_lock);
|
||||||
VERIFY(is_directory(mode));
|
VERIFY(is_directory(mode));
|
||||||
|
@ -1569,7 +1569,7 @@ KResult Ext2FS::create_directory(Ext2FSInode& parent_inode, const String& name,
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> Ext2FS::create_inode(Ext2FSInode& parent_inode, const String& name, mode_t mode, dev_t dev, uid_t uid, gid_t gid)
|
KResultOr<NonnullRefPtr<Inode>> Ext2FS::create_inode(Ext2FSInode& parent_inode, const String& name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
if (name.length() > EXT2_NAME_LEN)
|
if (name.length() > EXT2_NAME_LEN)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
|
@ -1580,8 +1580,8 @@ KResultOr<NonnullRefPtr<Inode>> Ext2FS::create_inode(Ext2FSInode& parent_inode,
|
||||||
ext2_inode e2inode {};
|
ext2_inode e2inode {};
|
||||||
auto now = kgettimeofday().to_truncated_seconds();
|
auto now = kgettimeofday().to_truncated_seconds();
|
||||||
e2inode.i_mode = mode;
|
e2inode.i_mode = mode;
|
||||||
e2inode.i_uid = uid;
|
e2inode.i_uid = uid.value();
|
||||||
e2inode.i_gid = gid;
|
e2inode.i_gid = gid.value();
|
||||||
e2inode.i_size = 0;
|
e2inode.i_size = 0;
|
||||||
e2inode.i_atime = now;
|
e2inode.i_atime = now;
|
||||||
e2inode.i_ctime = now;
|
e2inode.i_ctime = now;
|
||||||
|
@ -1740,13 +1740,13 @@ KResult Ext2FSInode::chmod(mode_t mode)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::chown(uid_t uid, gid_t gid)
|
KResult Ext2FSInode::chown(UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_inode_lock);
|
MutexLocker locker(m_inode_lock);
|
||||||
if (m_raw_inode.i_uid == uid && m_raw_inode.i_gid == gid)
|
if (m_raw_inode.i_uid == uid && m_raw_inode.i_gid == gid)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
m_raw_inode.i_uid = uid;
|
m_raw_inode.i_uid = uid.value();
|
||||||
m_raw_inode.i_gid = gid;
|
m_raw_inode.i_gid = gid.value();
|
||||||
set_metadata_dirty(true);
|
set_metadata_dirty(true);
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ private:
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode& child, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode& child, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult set_atime(time_t) override;
|
virtual KResult set_atime(time_t) override;
|
||||||
|
@ -53,7 +53,7 @@ private:
|
||||||
virtual KResult increment_link_count() override;
|
virtual KResult increment_link_count() override;
|
||||||
virtual KResult decrement_link_count() override;
|
virtual KResult decrement_link_count() override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
virtual KResultOr<int> get_block_address(int) override;
|
virtual KResultOr<int> get_block_address(int) override;
|
||||||
|
|
||||||
|
@ -130,8 +130,8 @@ private:
|
||||||
virtual StringView class_name() const override { return "Ext2FS"sv; }
|
virtual StringView class_name() const override { return "Ext2FS"sv; }
|
||||||
virtual Ext2FSInode& root_inode() override;
|
virtual Ext2FSInode& root_inode() override;
|
||||||
RefPtr<Inode> get_inode(InodeIdentifier) const;
|
RefPtr<Inode> get_inode(InodeIdentifier) const;
|
||||||
KResultOr<NonnullRefPtr<Inode>> create_inode(Ext2FSInode& parent_inode, const String& name, mode_t, dev_t, uid_t, gid_t);
|
KResultOr<NonnullRefPtr<Inode>> create_inode(Ext2FSInode& parent_inode, const String& name, mode_t, dev_t, UserID, GroupID);
|
||||||
KResult create_directory(Ext2FSInode& parent_inode, const String& name, mode_t, uid_t, gid_t);
|
KResult create_directory(Ext2FSInode& parent_inode, const String& name, mode_t, UserID, GroupID);
|
||||||
virtual void flush_writes() override;
|
virtual void flush_writes() override;
|
||||||
|
|
||||||
BlockIndex first_block_index() const;
|
BlockIndex first_block_index() const;
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Kernel {
|
||||||
|
|
||||||
static Atomic<int> s_next_fifo_id = 1;
|
static Atomic<int> s_next_fifo_id = 1;
|
||||||
|
|
||||||
RefPtr<FIFO> FIFO::try_create(uid_t uid)
|
RefPtr<FIFO> FIFO::try_create(UserID uid)
|
||||||
{
|
{
|
||||||
auto buffer = DoubleBuffer::try_create();
|
auto buffer = DoubleBuffer::try_create();
|
||||||
if (buffer)
|
if (buffer)
|
||||||
|
@ -65,7 +65,7 @@ KResultOr<NonnullRefPtr<FileDescription>> FIFO::open_direction_blocking(FIFO::Di
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
FIFO::FIFO(uid_t uid, NonnullOwnPtr<DoubleBuffer> buffer)
|
FIFO::FIFO(UserID uid, NonnullOwnPtr<DoubleBuffer> buffer)
|
||||||
: m_buffer(move(buffer))
|
: m_buffer(move(buffer))
|
||||||
, m_uid(uid)
|
, m_uid(uid)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,10 +24,10 @@ public:
|
||||||
Writer
|
Writer
|
||||||
};
|
};
|
||||||
|
|
||||||
static RefPtr<FIFO> try_create(uid_t);
|
static RefPtr<FIFO> try_create(UserID);
|
||||||
virtual ~FIFO() override;
|
virtual ~FIFO() override;
|
||||||
|
|
||||||
uid_t uid() const { return m_uid; }
|
UserID uid() const { return m_uid; }
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<FileDescription>> open_direction(Direction);
|
KResultOr<NonnullRefPtr<FileDescription>> open_direction(Direction);
|
||||||
KResultOr<NonnullRefPtr<FileDescription>> open_direction_blocking(Direction);
|
KResultOr<NonnullRefPtr<FileDescription>> open_direction_blocking(Direction);
|
||||||
|
@ -49,13 +49,13 @@ private:
|
||||||
virtual StringView class_name() const override { return "FIFO"; }
|
virtual StringView class_name() const override { return "FIFO"; }
|
||||||
virtual bool is_fifo() const override { return true; }
|
virtual bool is_fifo() const override { return true; }
|
||||||
|
|
||||||
explicit FIFO(uid_t, NonnullOwnPtr<DoubleBuffer> buffer);
|
explicit FIFO(UserID, NonnullOwnPtr<DoubleBuffer> buffer);
|
||||||
|
|
||||||
unsigned m_writers { 0 };
|
unsigned m_writers { 0 };
|
||||||
unsigned m_readers { 0 };
|
unsigned m_readers { 0 };
|
||||||
NonnullOwnPtr<DoubleBuffer> m_buffer;
|
NonnullOwnPtr<DoubleBuffer> m_buffer;
|
||||||
|
|
||||||
uid_t m_uid { 0 };
|
UserID m_uid { 0 };
|
||||||
|
|
||||||
int m_fifo_id { 0 };
|
int m_fifo_id { 0 };
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ public:
|
||||||
virtual String absolute_path(const FileDescription&) const = 0;
|
virtual String absolute_path(const FileDescription&) const = 0;
|
||||||
|
|
||||||
virtual KResult truncate(u64) { return EINVAL; }
|
virtual KResult truncate(u64) { return EINVAL; }
|
||||||
virtual KResult chown(FileDescription&, uid_t, gid_t) { return EBADF; }
|
virtual KResult chown(FileDescription&, UserID, GroupID) { return EBADF; }
|
||||||
virtual KResult chmod(FileDescription&, mode_t) { return EBADF; }
|
virtual KResult chmod(FileDescription&, mode_t) { return EBADF; }
|
||||||
|
|
||||||
virtual StringView class_name() const = 0;
|
virtual StringView class_name() const = 0;
|
||||||
|
|
|
@ -437,7 +437,7 @@ KResult FileDescription::chmod(mode_t mode)
|
||||||
return m_file->chmod(*this, mode);
|
return m_file->chmod(*this, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult FileDescription::chown(uid_t uid, gid_t gid)
|
KResult FileDescription::chown(UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_lock);
|
MutexLocker locker(m_lock);
|
||||||
return m_file->chown(*this, uid, gid);
|
return m_file->chown(*this, uid, gid);
|
||||||
|
|
|
@ -123,7 +123,7 @@ public:
|
||||||
|
|
||||||
off_t offset() const { return m_current_offset; }
|
off_t offset() const { return m_current_offset; }
|
||||||
|
|
||||||
KResult chown(uid_t, gid_t);
|
KResult chown(UserID, GroupID);
|
||||||
|
|
||||||
FileBlockerSet& blocker_set();
|
FileBlockerSet& blocker_set();
|
||||||
|
|
||||||
|
|
|
@ -565,7 +565,7 @@ KResultOr<size_t> ISO9660Inode::write_bytes(off_t, size_t, const UserOrKernelBuf
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> ISO9660Inode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> ISO9660Inode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
@ -585,7 +585,7 @@ KResult ISO9660Inode::chmod(mode_t)
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult ISO9660Inode::chown(uid_t, gid_t)
|
KResult ISO9660Inode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,11 +353,11 @@ public:
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
virtual KResult set_atime(time_t) override;
|
virtual KResult set_atime(time_t) override;
|
||||||
virtual KResult set_ctime(time_t) override;
|
virtual KResult set_ctime(time_t) override;
|
||||||
|
|
|
@ -55,11 +55,11 @@ public:
|
||||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const = 0;
|
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const = 0;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) = 0;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) = 0;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) = 0;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) = 0;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) = 0;
|
||||||
virtual KResult remove_child(const StringView& name) = 0;
|
virtual KResult remove_child(const StringView& name) = 0;
|
||||||
virtual KResult chmod(mode_t) = 0;
|
virtual KResult chmod(mode_t) = 0;
|
||||||
virtual KResult chown(uid_t, gid_t) = 0;
|
virtual KResult chown(UserID, GroupID) = 0;
|
||||||
virtual KResult truncate(u64) { return KSuccess; }
|
virtual KResult truncate(u64) { return KSuccess; }
|
||||||
virtual KResultOr<NonnullRefPtr<Custody>> resolve_as_link(Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const;
|
virtual KResultOr<NonnullRefPtr<Custody>> resolve_as_link(Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const;
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ KResult InodeFile::truncate(u64 size)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult InodeFile::chown(FileDescription& description, uid_t uid, gid_t gid)
|
KResult InodeFile::chown(FileDescription& description, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
VERIFY(description.inode() == m_inode);
|
VERIFY(description.inode() == m_inode);
|
||||||
VERIFY(description.custody());
|
VERIFY(description.custody());
|
||||||
|
|
|
@ -39,7 +39,7 @@ 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(FileDescription&, uid_t, gid_t) override;
|
virtual KResult chown(FileDescription&, UserID, GroupID) override;
|
||||||
virtual KResult chmod(FileDescription&, mode_t) override;
|
virtual KResult chmod(FileDescription&, mode_t) override;
|
||||||
|
|
||||||
virtual StringView class_name() const override { return "InodeFile"; }
|
virtual StringView class_name() const override { return "InodeFile"; }
|
||||||
|
|
|
@ -38,7 +38,7 @@ struct InodeMetadata {
|
||||||
bool may_write(const Process&) const;
|
bool may_write(const Process&) const;
|
||||||
bool may_execute(const Process&) const;
|
bool may_execute(const Process&) const;
|
||||||
|
|
||||||
bool may_read(uid_t u, gid_t g, Span<const gid_t> eg) const
|
bool may_read(UserID u, GroupID g, Span<GroupID const> eg) const
|
||||||
{
|
{
|
||||||
if (u == 0)
|
if (u == 0)
|
||||||
return true;
|
return true;
|
||||||
|
@ -49,7 +49,7 @@ struct InodeMetadata {
|
||||||
return mode & S_IROTH;
|
return mode & S_IROTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool may_write(uid_t u, gid_t g, Span<const gid_t> eg) const
|
bool may_write(UserID u, GroupID g, Span<GroupID const> eg) const
|
||||||
{
|
{
|
||||||
if (u == 0)
|
if (u == 0)
|
||||||
return true;
|
return true;
|
||||||
|
@ -60,7 +60,7 @@ struct InodeMetadata {
|
||||||
return mode & S_IWOTH;
|
return mode & S_IWOTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool may_execute(uid_t u, gid_t g, Span<const gid_t> eg) const
|
bool may_execute(UserID u, GroupID g, Span<GroupID const> eg) const
|
||||||
{
|
{
|
||||||
if (u == 0)
|
if (u == 0)
|
||||||
return true;
|
return true;
|
||||||
|
@ -91,8 +91,8 @@ struct InodeMetadata {
|
||||||
buffer.st_ino = inode.index().value();
|
buffer.st_ino = inode.index().value();
|
||||||
buffer.st_mode = mode;
|
buffer.st_mode = mode;
|
||||||
buffer.st_nlink = link_count;
|
buffer.st_nlink = link_count;
|
||||||
buffer.st_uid = uid;
|
buffer.st_uid = uid.value();
|
||||||
buffer.st_gid = gid;
|
buffer.st_gid = gid.value();
|
||||||
buffer.st_dev = 0; // FIXME
|
buffer.st_dev = 0; // FIXME
|
||||||
buffer.st_size = size;
|
buffer.st_size = size;
|
||||||
buffer.st_blksize = block_size;
|
buffer.st_blksize = block_size;
|
||||||
|
@ -109,8 +109,8 @@ struct InodeMetadata {
|
||||||
InodeIdentifier inode;
|
InodeIdentifier inode;
|
||||||
off_t size { 0 };
|
off_t size { 0 };
|
||||||
mode_t mode { 0 };
|
mode_t mode { 0 };
|
||||||
uid_t uid { 0 };
|
UserID uid { 0 };
|
||||||
gid_t gid { 0 };
|
GroupID gid { 0 };
|
||||||
nlink_t link_count { 0 };
|
nlink_t link_count { 0 };
|
||||||
time_t atime { 0 };
|
time_t atime { 0 };
|
||||||
time_t ctime { 0 };
|
time_t ctime { 0 };
|
||||||
|
|
|
@ -934,7 +934,7 @@ KResultOr<NonnullRefPtr<Inode>> Plan9FSInode::lookup(StringView name)
|
||||||
return Plan9FSInode::create(fs(), newfid);
|
return Plan9FSInode::create(fs(), newfid);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> Plan9FSInode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> Plan9FSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
return ENOTIMPL;
|
return ENOTIMPL;
|
||||||
|
@ -958,7 +958,7 @@ KResult Plan9FSInode::chmod(mode_t)
|
||||||
return ENOTIMPL;
|
return ENOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Plan9FSInode::chown(uid_t, gid_t)
|
KResult Plan9FSInode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
return ENOTIMPL;
|
return ENOTIMPL;
|
||||||
|
|
|
@ -160,11 +160,11 @@ public:
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& data, FileDescription*) override;
|
||||||
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
virtual KResult traverse_as_directory(Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -83,7 +83,7 @@ KResult ProcFSInode::add_child(Inode&, const StringView&, mode_t)
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> ProcFSInode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ KResult ProcFSInode::chmod(mode_t)
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult ProcFSInode::chown(uid_t, gid_t)
|
KResult ProcFSInode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,11 +57,11 @@ protected:
|
||||||
virtual KResult attach(FileDescription& description) = 0;
|
virtual KResult attach(FileDescription& description) = 0;
|
||||||
virtual void did_seek(FileDescription&, off_t) = 0;
|
virtual void did_seek(FileDescription&, off_t) = 0;
|
||||||
virtual void flush_metadata() override final;
|
virtual void flush_metadata() override final;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override final;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override final;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override final;
|
||||||
virtual KResult remove_child(const StringView& name) override final;
|
virtual KResult remove_child(const StringView& name) override final;
|
||||||
virtual KResult chmod(mode_t) override final;
|
virtual KResult chmod(mode_t) override final;
|
||||||
virtual KResult chown(uid_t, gid_t) override final;
|
virtual KResult chown(UserID, GroupID) override final;
|
||||||
virtual KResult truncate(u64) override final;
|
virtual KResult truncate(u64) override final;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ KResultOr<size_t> SysFSInode::write_bytes(off_t offset, size_t count, UserOrKern
|
||||||
return m_associated_component->write_bytes(offset, count, buffer, fd);
|
return m_associated_component->write_bytes(offset, count, buffer, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> SysFSInode::create_child(StringView, mode_t, dev_t, uid_t, gid_t)
|
KResultOr<NonnullRefPtr<Inode>> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ KResult SysFSInode::chmod(mode_t)
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult SysFSInode::chown(uid_t, gid_t)
|
KResult SysFSInode::chown(UserID, GroupID)
|
||||||
{
|
{
|
||||||
return EPERM;
|
return EPERM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,11 +89,11 @@ protected:
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual InodeMetadata metadata() const override;
|
virtual InodeMetadata metadata() const override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
|
virtual KResult add_child(Inode&, StringView const& name, mode_t) override;
|
||||||
virtual KResult remove_child(StringView const& name) override;
|
virtual KResult remove_child(StringView const& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
|
|
||||||
NonnullRefPtr<SysFSComponent> m_associated_component;
|
NonnullRefPtr<SysFSComponent> m_associated_component;
|
||||||
|
|
|
@ -249,7 +249,7 @@ KResult TmpFSInode::chmod(mode_t mode)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult TmpFSInode::chown(uid_t uid, gid_t gid)
|
KResult TmpFSInode::chown(UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_inode_lock);
|
MutexLocker locker(m_inode_lock);
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ KResult TmpFSInode::chown(uid_t uid, gid_t gid)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<Inode>> TmpFSInode::create_child(StringView name, mode_t mode, dev_t dev, uid_t uid, gid_t gid)
|
KResultOr<NonnullRefPtr<Inode>> TmpFSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_inode_lock);
|
MutexLocker locker(m_inode_lock);
|
||||||
|
|
||||||
|
|
|
@ -58,11 +58,11 @@ public:
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, const UserOrKernelBuffer& buffer, FileDescription*) override;
|
||||||
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, uid_t, gid_t) override;
|
virtual KResultOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
|
||||||
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
virtual KResult add_child(Inode&, const StringView& name, mode_t) override;
|
||||||
virtual KResult remove_child(const StringView& name) override;
|
virtual KResult remove_child(const StringView& name) override;
|
||||||
virtual KResult chmod(mode_t) override;
|
virtual KResult chmod(mode_t) override;
|
||||||
virtual KResult chown(uid_t, gid_t) override;
|
virtual KResult chown(UserID, GroupID) override;
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
virtual KResult set_atime(time_t) override;
|
virtual KResult set_atime(time_t) override;
|
||||||
virtual KResult set_ctime(time_t) override;
|
virtual KResult set_ctime(time_t) override;
|
||||||
|
|
|
@ -370,8 +370,8 @@ KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::create(StringView p
|
||||||
return EROFS;
|
return EROFS;
|
||||||
|
|
||||||
dbgln_if(VFS_DEBUG, "VirtualFileSystem::create: '{}' in {}", basename, parent_inode.identifier());
|
dbgln_if(VFS_DEBUG, "VirtualFileSystem::create: '{}' in {}", basename, parent_inode.identifier());
|
||||||
uid_t uid = owner.has_value() ? owner.value().uid : current_process.euid();
|
auto uid = owner.has_value() ? owner.value().uid : current_process.euid();
|
||||||
gid_t gid = owner.has_value() ? owner.value().gid : current_process.egid();
|
auto gid = owner.has_value() ? owner.value().gid : current_process.egid();
|
||||||
auto inode_or_error = parent_inode.create_child(basename, mode, 0, uid, gid);
|
auto inode_or_error = parent_inode.create_child(basename, mode, 0, uid, gid);
|
||||||
if (inode_or_error.is_error())
|
if (inode_or_error.is_error())
|
||||||
return inode_or_error.error();
|
return inode_or_error.error();
|
||||||
|
@ -582,7 +582,7 @@ KResult VirtualFileSystem::rename(StringView old_path, StringView new_path, Cust
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult VirtualFileSystem::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
|
KResult VirtualFileSystem::chown(Custody& custody, UserID a_uid, GroupID a_gid)
|
||||||
{
|
{
|
||||||
auto& inode = custody.inode();
|
auto& inode = custody.inode();
|
||||||
auto metadata = inode.metadata();
|
auto metadata = inode.metadata();
|
||||||
|
@ -591,8 +591,8 @@ KResult VirtualFileSystem::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
|
||||||
if (current_process.euid() != metadata.uid && !current_process.is_superuser())
|
if (current_process.euid() != metadata.uid && !current_process.is_superuser())
|
||||||
return EPERM;
|
return EPERM;
|
||||||
|
|
||||||
uid_t new_uid = metadata.uid;
|
UserID new_uid = metadata.uid;
|
||||||
gid_t new_gid = metadata.gid;
|
GroupID new_gid = metadata.gid;
|
||||||
|
|
||||||
if (a_uid != (uid_t)-1) {
|
if (a_uid != (uid_t)-1) {
|
||||||
if (current_process.euid() != a_uid && !current_process.is_superuser())
|
if (current_process.euid() != a_uid && !current_process.is_superuser())
|
||||||
|
@ -619,7 +619,7 @@ KResult VirtualFileSystem::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
|
||||||
return inode.chown(new_uid, new_gid);
|
return inode.chown(new_uid, new_gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult VirtualFileSystem::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base)
|
KResult VirtualFileSystem::chown(StringView path, UserID a_uid, GroupID a_gid, Custody& base)
|
||||||
{
|
{
|
||||||
auto custody_or_error = resolve_path(path, base);
|
auto custody_or_error = resolve_path(path, base);
|
||||||
if (custody_or_error.is_error())
|
if (custody_or_error.is_error())
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace Kernel {
|
||||||
#define O_UNLINK_INTERNAL (1 << 30)
|
#define O_UNLINK_INTERNAL (1 << 30)
|
||||||
|
|
||||||
struct UidAndGid {
|
struct UidAndGid {
|
||||||
uid_t uid;
|
UserID uid;
|
||||||
gid_t gid;
|
GroupID gid;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VirtualFileSystem {
|
class VirtualFileSystem {
|
||||||
|
@ -57,8 +57,8 @@ public:
|
||||||
KResult rmdir(StringView path, Custody& base);
|
KResult rmdir(StringView path, Custody& base);
|
||||||
KResult chmod(StringView path, mode_t, Custody& base);
|
KResult chmod(StringView path, mode_t, Custody& base);
|
||||||
KResult chmod(Custody&, mode_t);
|
KResult chmod(Custody&, mode_t);
|
||||||
KResult chown(StringView path, uid_t, gid_t, Custody& base);
|
KResult chown(StringView path, UserID, GroupID, Custody& base);
|
||||||
KResult chown(Custody&, uid_t, gid_t);
|
KResult chown(Custody&, UserID, GroupID);
|
||||||
KResult access(StringView path, int mode, Custody& base);
|
KResult access(StringView path, int mode, Custody& base);
|
||||||
KResultOr<InodeMetadata> lookup_metadata(StringView path, Custody& base, int options = 0);
|
KResultOr<InodeMetadata> lookup_metadata(StringView path, Custody& base, int options = 0);
|
||||||
KResult utime(StringView path, Custody& base, time_t atime, time_t mtime);
|
KResult utime(StringView path, Custody& base, time_t atime, time_t mtime);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <AK/DistinctNumeric.h>
|
#include <AK/DistinctNumeric.h>
|
||||||
|
#include <Kernel/API/POSIX/sys/types.h>
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
|
@ -98,4 +99,7 @@ TYPEDEF_DISTINCT_ORDERED_ID(pid_t, ThreadID);
|
||||||
TYPEDEF_DISTINCT_ORDERED_ID(pid_t, SessionID);
|
TYPEDEF_DISTINCT_ORDERED_ID(pid_t, SessionID);
|
||||||
TYPEDEF_DISTINCT_ORDERED_ID(pid_t, ProcessGroupID);
|
TYPEDEF_DISTINCT_ORDERED_ID(pid_t, ProcessGroupID);
|
||||||
|
|
||||||
|
TYPEDEF_DISTINCT_ORDERED_ID(uid_t, UserID);
|
||||||
|
TYPEDEF_DISTINCT_ORDERED_ID(gid_t, GroupID);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,8 +111,8 @@ private:
|
||||||
obj.add("bytes_out", socket.bytes_out());
|
obj.add("bytes_out", socket.bytes_out());
|
||||||
if (Process::current().is_superuser() || Process::current().uid() == socket.origin_uid()) {
|
if (Process::current().is_superuser() || Process::current().uid() == socket.origin_uid()) {
|
||||||
obj.add("origin_pid", socket.origin_pid());
|
obj.add("origin_pid", socket.origin_pid());
|
||||||
obj.add("origin_uid", socket.origin_uid());
|
obj.add("origin_uid", socket.origin_uid().value());
|
||||||
obj.add("origin_gid", socket.origin_gid());
|
obj.add("origin_gid", socket.origin_gid().value());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
array.finish();
|
array.finish();
|
||||||
|
@ -133,11 +133,11 @@ private:
|
||||||
auto obj = array.add_object();
|
auto obj = array.add_object();
|
||||||
obj.add("path", String(socket.socket_path()));
|
obj.add("path", String(socket.socket_path()));
|
||||||
obj.add("origin_pid", socket.origin_pid());
|
obj.add("origin_pid", socket.origin_pid());
|
||||||
obj.add("origin_uid", socket.origin_uid());
|
obj.add("origin_uid", socket.origin_uid().value());
|
||||||
obj.add("origin_gid", socket.origin_gid());
|
obj.add("origin_gid", socket.origin_gid().value());
|
||||||
obj.add("acceptor_pid", socket.acceptor_pid());
|
obj.add("acceptor_pid", socket.acceptor_pid());
|
||||||
obj.add("acceptor_uid", socket.acceptor_uid());
|
obj.add("acceptor_uid", socket.acceptor_uid().value());
|
||||||
obj.add("acceptor_gid", socket.acceptor_gid());
|
obj.add("acceptor_gid", socket.acceptor_gid().value());
|
||||||
});
|
});
|
||||||
array.finish();
|
array.finish();
|
||||||
return true;
|
return true;
|
||||||
|
@ -161,8 +161,8 @@ private:
|
||||||
obj.add("peer_port", socket.peer_port());
|
obj.add("peer_port", socket.peer_port());
|
||||||
if (Process::current().is_superuser() || Process::current().uid() == socket.origin_uid()) {
|
if (Process::current().is_superuser() || Process::current().uid() == socket.origin_uid()) {
|
||||||
obj.add("origin_pid", socket.origin_pid());
|
obj.add("origin_pid", socket.origin_pid());
|
||||||
obj.add("origin_uid", socket.origin_uid());
|
obj.add("origin_uid", socket.origin_uid().value());
|
||||||
obj.add("origin_gid", socket.origin_gid());
|
obj.add("origin_gid", socket.origin_gid().value());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
array.finish();
|
array.finish();
|
||||||
|
@ -456,8 +456,8 @@ private:
|
||||||
process_object.add("pgid", process.tty() ? process.tty()->pgid().value() : 0);
|
process_object.add("pgid", process.tty() ? process.tty()->pgid().value() : 0);
|
||||||
process_object.add("pgp", process.pgid().value());
|
process_object.add("pgp", process.pgid().value());
|
||||||
process_object.add("sid", process.sid().value());
|
process_object.add("sid", process.sid().value());
|
||||||
process_object.add("uid", process.uid());
|
process_object.add("uid", process.uid().value());
|
||||||
process_object.add("gid", process.gid());
|
process_object.add("gid", process.gid().value());
|
||||||
process_object.add("ppid", process.ppid().value());
|
process_object.add("ppid", process.ppid().value());
|
||||||
process_object.add("nfds", process.fds().open_count());
|
process_object.add("nfds", process.fds().open_count());
|
||||||
process_object.add("name", process.name());
|
process_object.add("name", process.name());
|
||||||
|
|
|
@ -63,7 +63,7 @@ KResultOr<SocketPair> LocalSocket::create_connected_pair(int type)
|
||||||
memcpy(socket->m_address.sun_path, "[socketpair]", 13);
|
memcpy(socket->m_address.sun_path, "[socketpair]", 13);
|
||||||
|
|
||||||
auto& process = Process::current();
|
auto& process = Process::current();
|
||||||
socket->m_acceptor = { process.pid().value(), process.uid(), process.gid() };
|
socket->m_acceptor = { process.pid().value(), process.uid().value(), process.gid().value() };
|
||||||
|
|
||||||
socket->set_connected(true);
|
socket->set_connected(true);
|
||||||
socket->set_connect_side_role(Role::Connected);
|
socket->set_connect_side_role(Role::Connected);
|
||||||
|
@ -456,7 +456,7 @@ KResult LocalSocket::chmod(FileDescription&, mode_t mode)
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult LocalSocket::chown(FileDescription&, uid_t uid, gid_t gid)
|
KResult LocalSocket::chown(FileDescription&, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
if (m_file)
|
if (m_file)
|
||||||
return m_file->chown(uid, gid);
|
return m_file->chown(uid, gid);
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
virtual KResultOr<size_t> recvfrom(FileDescription&, UserOrKernelBuffer&, size_t, int flags, Userspace<sockaddr*>, Userspace<socklen_t*>, Time&) override;
|
||||||
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>) override;
|
||||||
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
virtual KResult ioctl(FileDescription&, unsigned request, Userspace<void*> arg) override;
|
||||||
virtual KResult chown(FileDescription&, uid_t, gid_t) override;
|
virtual KResult chown(FileDescription&, UserID, GroupID) override;
|
||||||
virtual KResult chmod(FileDescription&, mode_t) override;
|
virtual KResult chmod(FileDescription&, mode_t) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -72,8 +72,8 @@ private:
|
||||||
// An open socket file on the filesystem.
|
// An open socket file on the filesystem.
|
||||||
RefPtr<FileDescription> m_file;
|
RefPtr<FileDescription> m_file;
|
||||||
|
|
||||||
uid_t m_prebind_uid { 0 };
|
UserID m_prebind_uid { 0 };
|
||||||
gid_t m_prebind_gid { 0 };
|
GroupID m_prebind_gid { 0 };
|
||||||
mode_t m_prebind_mode { 0 };
|
mode_t m_prebind_mode { 0 };
|
||||||
|
|
||||||
// A single LocalSocket is shared between two file descriptions
|
// A single LocalSocket is shared between two file descriptions
|
||||||
|
|
|
@ -35,7 +35,7 @@ Socket::Socket(int domain, int type, int protocol)
|
||||||
, m_protocol(protocol)
|
, m_protocol(protocol)
|
||||||
{
|
{
|
||||||
auto& process = Process::current();
|
auto& process = Process::current();
|
||||||
m_origin = { process.pid().value(), process.uid(), process.gid() };
|
m_origin = { process.pid().value(), process.uid().value(), process.gid().value() };
|
||||||
}
|
}
|
||||||
|
|
||||||
Socket::~Socket()
|
Socket::~Socket()
|
||||||
|
@ -58,7 +58,7 @@ RefPtr<Socket> Socket::accept()
|
||||||
auto client = m_pending.take_first();
|
auto client = m_pending.take_first();
|
||||||
VERIFY(!client->is_connected());
|
VERIFY(!client->is_connected());
|
||||||
auto& process = Process::current();
|
auto& process = Process::current();
|
||||||
client->m_acceptor = { process.pid().value(), process.uid(), process.gid() };
|
client->m_acceptor = { process.pid().value(), process.uid().value(), process.gid().value() };
|
||||||
client->m_connected = true;
|
client->m_connected = true;
|
||||||
client->m_role = Role::Accepted;
|
client->m_role = Role::Accepted;
|
||||||
if (!m_pending.is_empty())
|
if (!m_pending.is_empty())
|
||||||
|
|
|
@ -92,11 +92,11 @@ public:
|
||||||
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>);
|
virtual KResult getsockopt(FileDescription&, int level, int option, Userspace<void*>, Userspace<socklen_t*>);
|
||||||
|
|
||||||
pid_t origin_pid() const { return m_origin.pid; }
|
pid_t origin_pid() const { return m_origin.pid; }
|
||||||
uid_t origin_uid() const { return m_origin.uid; }
|
UserID origin_uid() const { return m_origin.uid; }
|
||||||
gid_t origin_gid() const { return m_origin.gid; }
|
GroupID origin_gid() const { return m_origin.gid; }
|
||||||
pid_t acceptor_pid() const { return m_acceptor.pid; }
|
pid_t acceptor_pid() const { return m_acceptor.pid; }
|
||||||
uid_t acceptor_uid() const { return m_acceptor.uid; }
|
UserID acceptor_uid() const { return m_acceptor.uid; }
|
||||||
gid_t acceptor_gid() const { return m_acceptor.gid; }
|
GroupID acceptor_gid() const { return m_acceptor.gid; }
|
||||||
const RefPtr<NetworkAdapter> bound_interface() const { return m_bound_interface; }
|
const RefPtr<NetworkAdapter> bound_interface() const { return m_bound_interface; }
|
||||||
|
|
||||||
Mutex& lock() { return m_lock; }
|
Mutex& lock() { return m_lock; }
|
||||||
|
|
|
@ -94,7 +94,7 @@ NonnullRefPtrVector<Process> Process::all_processes()
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Process::in_group(gid_t gid) const
|
bool Process::in_group(GroupID gid) const
|
||||||
{
|
{
|
||||||
return this->gid() == gid || extra_gids().contains_slow(gid);
|
return this->gid() == gid || extra_gids().contains_slow(gid);
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ void Process::register_new(Process& process)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<Process> Process::create_user_process(RefPtr<Thread>& first_thread, const String& path, uid_t uid, gid_t gid, ProcessID parent_pid, int& error, Vector<String>&& arguments, Vector<String>&& environment, TTY* tty)
|
RefPtr<Process> Process::create_user_process(RefPtr<Thread>& first_thread, const String& path, UserID uid, GroupID gid, ProcessID parent_pid, int& error, Vector<String>&& arguments, Vector<String>&& environment, TTY* tty)
|
||||||
{
|
{
|
||||||
auto parts = path.split('/');
|
auto parts = path.split('/');
|
||||||
if (arguments.is_empty()) {
|
if (arguments.is_empty()) {
|
||||||
|
@ -192,7 +192,7 @@ RefPtr<Process> Process::create_user_process(RefPtr<Thread>& first_thread, const
|
||||||
|
|
||||||
RefPtr<Process> Process::create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register)
|
RefPtr<Process> Process::create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register)
|
||||||
{
|
{
|
||||||
auto process = Process::create(first_thread, move(name), (uid_t)0, (gid_t)0, ProcessID(0), true);
|
auto process = Process::create(first_thread, move(name), UserID(0), GroupID(0), ProcessID(0), true);
|
||||||
if (!first_thread || !process)
|
if (!first_thread || !process)
|
||||||
return {};
|
return {};
|
||||||
first_thread->regs().set_ip((FlatPtr)entry);
|
first_thread->regs().set_ip((FlatPtr)entry);
|
||||||
|
@ -225,7 +225,7 @@ void Process::unprotect_data()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<Process> Process::create(RefPtr<Thread>& first_thread, const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty, Process* fork_parent)
|
RefPtr<Process> Process::create(RefPtr<Thread>& first_thread, const String& name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty, Process* fork_parent)
|
||||||
{
|
{
|
||||||
auto space = Memory::AddressSpace::try_create(fork_parent ? &fork_parent->address_space() : nullptr);
|
auto space = Memory::AddressSpace::try_create(fork_parent ? &fork_parent->address_space() : nullptr);
|
||||||
if (!space)
|
if (!space)
|
||||||
|
@ -239,7 +239,7 @@ RefPtr<Process> Process::create(RefPtr<Thread>& first_thread, const String& name
|
||||||
return process;
|
return process;
|
||||||
}
|
}
|
||||||
|
|
||||||
Process::Process(const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty)
|
Process::Process(const String& name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty)
|
||||||
: m_name(move(name))
|
: m_name(move(name))
|
||||||
, m_is_kernel_process(is_kernel_process)
|
, m_is_kernel_process(is_kernel_process)
|
||||||
, m_executable(move(executable))
|
, m_executable(move(executable))
|
||||||
|
@ -521,7 +521,7 @@ siginfo_t Process::wait_info()
|
||||||
siginfo_t siginfo {};
|
siginfo_t siginfo {};
|
||||||
siginfo.si_signo = SIGCHLD;
|
siginfo.si_signo = SIGCHLD;
|
||||||
siginfo.si_pid = pid().value();
|
siginfo.si_pid = pid().value();
|
||||||
siginfo.si_uid = uid();
|
siginfo.si_uid = uid().value();
|
||||||
|
|
||||||
if (m_protected_values.termination_signal) {
|
if (m_protected_values.termination_signal) {
|
||||||
siginfo.si_status = m_protected_values.termination_signal;
|
siginfo.si_status = m_protected_values.termination_signal;
|
||||||
|
|
|
@ -93,13 +93,13 @@ class Process final
|
||||||
ProcessID pid { 0 };
|
ProcessID pid { 0 };
|
||||||
ProcessID ppid { 0 };
|
ProcessID ppid { 0 };
|
||||||
SessionID sid { 0 };
|
SessionID sid { 0 };
|
||||||
uid_t euid { 0 };
|
UserID euid { 0 };
|
||||||
gid_t egid { 0 };
|
GroupID egid { 0 };
|
||||||
uid_t uid { 0 };
|
UserID uid { 0 };
|
||||||
gid_t gid { 0 };
|
GroupID gid { 0 };
|
||||||
uid_t suid { 0 };
|
UserID suid { 0 };
|
||||||
gid_t sgid { 0 };
|
GroupID sgid { 0 };
|
||||||
Vector<gid_t> extra_gids;
|
Vector<GroupID> extra_gids;
|
||||||
bool dumpable { false };
|
bool dumpable { false };
|
||||||
Atomic<bool> has_promises { false };
|
Atomic<bool> has_promises { false };
|
||||||
Atomic<u32> promises { 0 };
|
Atomic<u32> promises { 0 };
|
||||||
|
@ -179,7 +179,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes);
|
static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, String&& name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes);
|
||||||
static RefPtr<Process> create_user_process(RefPtr<Thread>& first_thread, const String& path, uid_t, gid_t, ProcessID ppid, int& error, Vector<String>&& arguments = Vector<String>(), Vector<String>&& environment = Vector<String>(), TTY* = nullptr);
|
static RefPtr<Process> create_user_process(RefPtr<Thread>& first_thread, const String& path, UserID, GroupID, ProcessID ppid, int& error, Vector<String>&& arguments = Vector<String>(), Vector<String>&& environment = Vector<String>(), TTY* = nullptr);
|
||||||
static void register_new(Process&);
|
static void register_new(Process&);
|
||||||
|
|
||||||
bool unref() const;
|
bool unref() const;
|
||||||
|
@ -213,13 +213,13 @@ public:
|
||||||
bool is_session_leader() const { return sid().value() == pid().value(); }
|
bool is_session_leader() const { return sid().value() == pid().value(); }
|
||||||
ProcessGroupID pgid() const { return m_pg ? m_pg->pgid() : 0; }
|
ProcessGroupID pgid() const { return m_pg ? m_pg->pgid() : 0; }
|
||||||
bool is_group_leader() const { return pgid().value() == pid().value(); }
|
bool is_group_leader() const { return pgid().value() == pid().value(); }
|
||||||
const Vector<gid_t>& extra_gids() const { return m_protected_values.extra_gids; }
|
Vector<GroupID> const& extra_gids() const { return m_protected_values.extra_gids; }
|
||||||
uid_t euid() const { return m_protected_values.euid; }
|
UserID euid() const { return m_protected_values.euid; }
|
||||||
gid_t egid() const { return m_protected_values.egid; }
|
GroupID egid() const { return m_protected_values.egid; }
|
||||||
uid_t uid() const { return m_protected_values.uid; }
|
UserID uid() const { return m_protected_values.uid; }
|
||||||
gid_t gid() const { return m_protected_values.gid; }
|
GroupID gid() const { return m_protected_values.gid; }
|
||||||
uid_t suid() const { return m_protected_values.suid; }
|
UserID suid() const { return m_protected_values.suid; }
|
||||||
gid_t sgid() const { return m_protected_values.sgid; }
|
GroupID sgid() const { return m_protected_values.sgid; }
|
||||||
ProcessID ppid() const { return m_protected_values.ppid; }
|
ProcessID ppid() const { return m_protected_values.ppid; }
|
||||||
|
|
||||||
bool is_dumpable() const { return m_protected_values.dumpable; }
|
bool is_dumpable() const { return m_protected_values.dumpable; }
|
||||||
|
@ -227,7 +227,7 @@ public:
|
||||||
|
|
||||||
mode_t umask() const { return m_protected_values.umask; }
|
mode_t umask() const { return m_protected_values.umask; }
|
||||||
|
|
||||||
bool in_group(gid_t) const;
|
bool in_group(GroupID) const;
|
||||||
|
|
||||||
// Breakable iteration functions
|
// Breakable iteration functions
|
||||||
template<IteratorFunction<Process&> Callback>
|
template<IteratorFunction<Process&> Callback>
|
||||||
|
@ -288,8 +288,8 @@ public:
|
||||||
KResultOr<FlatPtr> sys$getegid();
|
KResultOr<FlatPtr> sys$getegid();
|
||||||
KResultOr<FlatPtr> sys$getpid();
|
KResultOr<FlatPtr> sys$getpid();
|
||||||
KResultOr<FlatPtr> sys$getppid();
|
KResultOr<FlatPtr> sys$getppid();
|
||||||
KResultOr<FlatPtr> sys$getresuid(Userspace<uid_t*>, Userspace<uid_t*>, Userspace<uid_t*>);
|
KResultOr<FlatPtr> sys$getresuid(Userspace<UserID*>, Userspace<UserID*>, Userspace<UserID*>);
|
||||||
KResultOr<FlatPtr> sys$getresgid(Userspace<gid_t*>, Userspace<gid_t*>, Userspace<gid_t*>);
|
KResultOr<FlatPtr> sys$getresgid(Userspace<GroupID*>, Userspace<GroupID*>, Userspace<GroupID*>);
|
||||||
KResultOr<FlatPtr> sys$umask(mode_t);
|
KResultOr<FlatPtr> sys$umask(mode_t);
|
||||||
KResultOr<FlatPtr> sys$open(Userspace<const Syscall::SC_open_params*>);
|
KResultOr<FlatPtr> sys$open(Userspace<const Syscall::SC_open_params*>);
|
||||||
KResultOr<FlatPtr> sys$close(int fd);
|
KResultOr<FlatPtr> sys$close(int fd);
|
||||||
|
@ -339,13 +339,13 @@ public:
|
||||||
KResultOr<FlatPtr> sys$setgroups(size_t, Userspace<const gid_t*>);
|
KResultOr<FlatPtr> sys$setgroups(size_t, Userspace<const gid_t*>);
|
||||||
KResultOr<FlatPtr> sys$pipe(int pipefd[2], int flags);
|
KResultOr<FlatPtr> sys$pipe(int pipefd[2], int flags);
|
||||||
KResultOr<FlatPtr> sys$killpg(pid_t pgrp, int sig);
|
KResultOr<FlatPtr> sys$killpg(pid_t pgrp, int sig);
|
||||||
KResultOr<FlatPtr> sys$seteuid(uid_t);
|
KResultOr<FlatPtr> sys$seteuid(UserID);
|
||||||
KResultOr<FlatPtr> sys$setegid(gid_t);
|
KResultOr<FlatPtr> sys$setegid(GroupID);
|
||||||
KResultOr<FlatPtr> sys$setuid(uid_t);
|
KResultOr<FlatPtr> sys$setuid(UserID);
|
||||||
KResultOr<FlatPtr> sys$setgid(gid_t);
|
KResultOr<FlatPtr> sys$setgid(GroupID);
|
||||||
KResultOr<FlatPtr> sys$setreuid(uid_t, uid_t);
|
KResultOr<FlatPtr> sys$setreuid(UserID, UserID);
|
||||||
KResultOr<FlatPtr> sys$setresuid(uid_t, uid_t, uid_t);
|
KResultOr<FlatPtr> sys$setresuid(UserID, UserID, UserID);
|
||||||
KResultOr<FlatPtr> sys$setresgid(gid_t, gid_t, gid_t);
|
KResultOr<FlatPtr> sys$setresgid(GroupID, GroupID, GroupID);
|
||||||
KResultOr<FlatPtr> sys$alarm(unsigned seconds);
|
KResultOr<FlatPtr> sys$alarm(unsigned seconds);
|
||||||
KResultOr<FlatPtr> sys$access(Userspace<const char*> pathname, size_t path_length, int mode);
|
KResultOr<FlatPtr> sys$access(Userspace<const char*> pathname, size_t path_length, int mode);
|
||||||
KResultOr<FlatPtr> sys$fcntl(int fd, int cmd, u32 extra_arg);
|
KResultOr<FlatPtr> sys$fcntl(int fd, int cmd, u32 extra_arg);
|
||||||
|
@ -362,7 +362,7 @@ public:
|
||||||
KResultOr<FlatPtr> sys$chmod(Userspace<const char*> pathname, size_t path_length, mode_t);
|
KResultOr<FlatPtr> sys$chmod(Userspace<const char*> pathname, size_t path_length, mode_t);
|
||||||
KResultOr<FlatPtr> sys$fchmod(int fd, mode_t);
|
KResultOr<FlatPtr> sys$fchmod(int fd, mode_t);
|
||||||
KResultOr<FlatPtr> sys$chown(Userspace<const Syscall::SC_chown_params*>);
|
KResultOr<FlatPtr> sys$chown(Userspace<const Syscall::SC_chown_params*>);
|
||||||
KResultOr<FlatPtr> sys$fchown(int fd, uid_t, gid_t);
|
KResultOr<FlatPtr> sys$fchown(int fd, UserID, GroupID);
|
||||||
KResultOr<FlatPtr> sys$socket(int domain, int type, int protocol);
|
KResultOr<FlatPtr> sys$socket(int domain, int type, int protocol);
|
||||||
KResultOr<FlatPtr> sys$bind(int sockfd, Userspace<const sockaddr*> addr, socklen_t);
|
KResultOr<FlatPtr> sys$bind(int sockfd, Userspace<const sockaddr*> addr, socklen_t);
|
||||||
KResultOr<FlatPtr> sys$listen(int sockfd, int backlog);
|
KResultOr<FlatPtr> sys$listen(int sockfd, int backlog);
|
||||||
|
@ -518,8 +518,8 @@ private:
|
||||||
bool add_thread(Thread&);
|
bool add_thread(Thread&);
|
||||||
bool remove_thread(Thread&);
|
bool remove_thread(Thread&);
|
||||||
|
|
||||||
Process(const String& name, uid_t uid, gid_t gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty);
|
Process(const String& name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd, RefPtr<Custody> executable, TTY* tty);
|
||||||
static RefPtr<Process> create(RefPtr<Thread>& first_thread, const String& name, uid_t, gid_t, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
|
static RefPtr<Process> create(RefPtr<Thread>& first_thread, const String& name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> cwd = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
|
||||||
KResult attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, RefPtr<Thread>& first_thread, Process* fork_parent);
|
KResult attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, RefPtr<Thread>& first_thread, Process* fork_parent);
|
||||||
static ProcessID allocate_pid();
|
static ProcessID allocate_pid();
|
||||||
|
|
||||||
|
@ -726,9 +726,8 @@ public:
|
||||||
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
|
||||||
virtual mode_t required_mode() const override { return 0555; }
|
virtual mode_t required_mode() const override { return 0555; }
|
||||||
|
|
||||||
virtual uid_t owner_user() const override;
|
virtual UserID owner_user() const override;
|
||||||
|
virtual GroupID owner_group() const override;
|
||||||
virtual gid_t owner_group() const override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ProcessProcFSTraits(WeakPtr<Process> process)
|
ProcessProcFSTraits(WeakPtr<Process> process)
|
||||||
|
|
|
@ -73,8 +73,8 @@ public:
|
||||||
virtual size_t size() const { return 0; }
|
virtual size_t size() const { return 0; }
|
||||||
|
|
||||||
virtual mode_t required_mode() const { return 0444; }
|
virtual mode_t required_mode() const { return 0444; }
|
||||||
virtual uid_t owner_user() const { return 0; }
|
virtual UserID owner_user() const { return 0; }
|
||||||
virtual gid_t owner_group() const { return 0; }
|
virtual GroupID owner_group() const { return 0; }
|
||||||
time_t modified_time() const { return TimeManagement::now().to_timeval().tv_sec; }
|
time_t modified_time() const { return TimeManagement::now().to_timeval().tv_sec; }
|
||||||
|
|
||||||
virtual void prepare_for_deletion() { }
|
virtual void prepare_for_deletion() { }
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
uid_t Process::ProcessProcFSTraits::owner_user() const
|
UserID Process::ProcessProcFSTraits::owner_user() const
|
||||||
{
|
{
|
||||||
auto process = m_process.strong_ref();
|
auto process = m_process.strong_ref();
|
||||||
if (!process)
|
if (!process)
|
||||||
|
@ -18,7 +18,7 @@ uid_t Process::ProcessProcFSTraits::owner_user() const
|
||||||
return process->uid();
|
return process->uid();
|
||||||
}
|
}
|
||||||
|
|
||||||
gid_t Process::ProcessProcFSTraits::owner_group() const
|
GroupID Process::ProcessProcFSTraits::owner_group() const
|
||||||
{
|
{
|
||||||
auto process = m_process.strong_ref();
|
auto process = m_process.strong_ref();
|
||||||
if (!process)
|
if (!process)
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$fchown(int fd, uid_t uid, gid_t gid)
|
KResultOr<FlatPtr> Process::sys$fchown(int fd, UserID uid, GroupID gid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
|
||||||
REQUIRE_PROMISE(chown);
|
REQUIRE_PROMISE(chown);
|
||||||
|
|
|
@ -40,7 +40,7 @@ struct LoadResult {
|
||||||
WeakPtr<Memory::Region> stack_region;
|
WeakPtr<Memory::Region> stack_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Vector<ELF::AuxiliaryValue> generate_auxiliary_vector(FlatPtr load_base, FlatPtr entry_eip, uid_t uid, uid_t euid, gid_t gid, gid_t egid, String executable_path, int main_program_fd);
|
static Vector<ELF::AuxiliaryValue> generate_auxiliary_vector(FlatPtr load_base, FlatPtr entry_eip, UserID uid, UserID euid, GroupID gid, GroupID egid, String executable_path, int main_program_fd);
|
||||||
|
|
||||||
static bool validate_stack_size(const Vector<String>& arguments, const Vector<String>& environment)
|
static bool validate_stack_size(const Vector<String>& arguments, const Vector<String>& environment)
|
||||||
{
|
{
|
||||||
|
@ -693,7 +693,7 @@ KResult Process::do_exec(NonnullRefPtr<FileDescription> main_program_description
|
||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vector<ELF::AuxiliaryValue> generate_auxiliary_vector(FlatPtr load_base, FlatPtr entry_eip, uid_t uid, uid_t euid, gid_t gid, gid_t egid, String executable_path, int main_program_fd)
|
static Vector<ELF::AuxiliaryValue> generate_auxiliary_vector(FlatPtr load_base, FlatPtr entry_eip, UserID uid, UserID euid, GroupID gid, GroupID egid, String executable_path, int main_program_fd)
|
||||||
{
|
{
|
||||||
Vector<ELF::AuxiliaryValue> auxv;
|
Vector<ELF::AuxiliaryValue> auxv;
|
||||||
// PHDR/EXECFD
|
// PHDR/EXECFD
|
||||||
|
@ -703,10 +703,10 @@ static Vector<ELF::AuxiliaryValue> generate_auxiliary_vector(FlatPtr load_base,
|
||||||
|
|
||||||
auxv.append({ ELF::AuxiliaryValue::Entry, (void*)entry_eip });
|
auxv.append({ ELF::AuxiliaryValue::Entry, (void*)entry_eip });
|
||||||
// NOTELF
|
// NOTELF
|
||||||
auxv.append({ ELF::AuxiliaryValue::Uid, (long)uid });
|
auxv.append({ ELF::AuxiliaryValue::Uid, (long)uid.value() });
|
||||||
auxv.append({ ELF::AuxiliaryValue::EUid, (long)euid });
|
auxv.append({ ELF::AuxiliaryValue::EUid, (long)euid.value() });
|
||||||
auxv.append({ ELF::AuxiliaryValue::Gid, (long)gid });
|
auxv.append({ ELF::AuxiliaryValue::Gid, (long)gid.value() });
|
||||||
auxv.append({ ELF::AuxiliaryValue::EGid, (long)egid });
|
auxv.append({ ELF::AuxiliaryValue::EGid, (long)egid.value() });
|
||||||
|
|
||||||
auxv.append({ ELF::AuxiliaryValue::Platform, Processor::platform_string() });
|
auxv.append({ ELF::AuxiliaryValue::Platform, Processor::platform_string() });
|
||||||
// FIXME: This is platform specific
|
// FIXME: This is platform specific
|
||||||
|
|
|
@ -12,31 +12,31 @@ KResultOr<FlatPtr> Process::sys$getuid()
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
return uid();
|
return uid().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$getgid()
|
KResultOr<FlatPtr> Process::sys$getgid()
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
return gid();
|
return gid().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$geteuid()
|
KResultOr<FlatPtr> Process::sys$geteuid()
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
return euid();
|
return euid().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$getegid()
|
KResultOr<FlatPtr> Process::sys$getegid()
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
return egid();
|
return egid().value();
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$getresuid(Userspace<uid_t*> ruid, Userspace<uid_t*> euid, Userspace<uid_t*> suid)
|
KResultOr<FlatPtr> Process::sys$getresuid(Userspace<UserID*> ruid, Userspace<UserID*> euid, Userspace<UserID*> suid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
|
@ -45,7 +45,7 @@ KResultOr<FlatPtr> Process::sys$getresuid(Userspace<uid_t*> ruid, Userspace<uid_
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$getresgid(Userspace<gid_t*> rgid, Userspace<gid_t*> egid, Userspace<gid_t*> sgid)
|
KResultOr<FlatPtr> Process::sys$getresgid(Userspace<GroupID*> rgid, Userspace<GroupID*> egid, Userspace<GroupID*> sgid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(stdio);
|
REQUIRE_PROMISE(stdio);
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$seteuid(uid_t new_euid)
|
KResultOr<FlatPtr> Process::sys$seteuid(UserID new_euid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -25,7 +25,7 @@ KResultOr<FlatPtr> Process::sys$seteuid(uid_t new_euid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setegid(gid_t new_egid)
|
KResultOr<FlatPtr> Process::sys$setegid(GroupID new_egid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -41,7 +41,7 @@ KResultOr<FlatPtr> Process::sys$setegid(gid_t new_egid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setuid(uid_t new_uid)
|
KResultOr<FlatPtr> Process::sys$setuid(UserID new_uid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -59,7 +59,7 @@ KResultOr<FlatPtr> Process::sys$setuid(uid_t new_uid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setgid(gid_t new_gid)
|
KResultOr<FlatPtr> Process::sys$setgid(GroupID new_gid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -77,7 +77,7 @@ KResultOr<FlatPtr> Process::sys$setgid(gid_t new_gid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setreuid(uid_t new_ruid, uid_t new_euid)
|
KResultOr<FlatPtr> Process::sys$setreuid(UserID new_ruid, UserID new_euid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -87,7 +87,7 @@ KResultOr<FlatPtr> Process::sys$setreuid(uid_t new_ruid, uid_t new_euid)
|
||||||
if (new_euid == (uid_t)-1)
|
if (new_euid == (uid_t)-1)
|
||||||
new_euid = euid();
|
new_euid = euid();
|
||||||
|
|
||||||
auto ok = [this](uid_t id) { return id == uid() || id == euid() || id == suid(); };
|
auto ok = [this](UserID id) { return id == uid() || id == euid() || id == suid(); };
|
||||||
if (!ok(new_ruid) || !ok(new_euid))
|
if (!ok(new_ruid) || !ok(new_euid))
|
||||||
return EPERM;
|
return EPERM;
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ KResultOr<FlatPtr> Process::sys$setreuid(uid_t new_ruid, uid_t new_euid)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setresuid(uid_t new_ruid, uid_t new_euid, uid_t new_suid)
|
KResultOr<FlatPtr> Process::sys$setresuid(UserID new_ruid, UserID new_euid, UserID new_suid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -115,7 +115,7 @@ KResultOr<FlatPtr> Process::sys$setresuid(uid_t new_ruid, uid_t new_euid, uid_t
|
||||||
if (new_suid == (uid_t)-1)
|
if (new_suid == (uid_t)-1)
|
||||||
new_suid = suid();
|
new_suid = suid();
|
||||||
|
|
||||||
auto ok = [this](uid_t id) { return id == uid() || id == euid() || id == suid(); };
|
auto ok = [this](UserID id) { return id == uid() || id == euid() || id == suid(); };
|
||||||
if ((!ok(new_ruid) || !ok(new_euid) || !ok(new_suid)) && !is_superuser())
|
if ((!ok(new_ruid) || !ok(new_euid) || !ok(new_suid)) && !is_superuser())
|
||||||
return EPERM;
|
return EPERM;
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ KResultOr<FlatPtr> Process::sys$setresuid(uid_t new_ruid, uid_t new_euid, uid_t
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<FlatPtr> Process::sys$setresgid(gid_t new_rgid, gid_t new_egid, gid_t new_sgid)
|
KResultOr<FlatPtr> Process::sys$setresgid(GroupID new_rgid, GroupID new_egid, GroupID new_sgid)
|
||||||
{
|
{
|
||||||
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this)
|
||||||
REQUIRE_PROMISE(id);
|
REQUIRE_PROMISE(id);
|
||||||
|
@ -141,7 +141,7 @@ KResultOr<FlatPtr> Process::sys$setresgid(gid_t new_rgid, gid_t new_egid, gid_t
|
||||||
if (new_sgid == (gid_t)-1)
|
if (new_sgid == (gid_t)-1)
|
||||||
new_sgid = sgid();
|
new_sgid = sgid();
|
||||||
|
|
||||||
auto ok = [this](gid_t id) { return id == gid() || id == egid() || id == sgid(); };
|
auto ok = [this](GroupID id) { return id == gid() || id == egid() || id == sgid(); };
|
||||||
if ((!ok(new_rgid) || !ok(new_egid) || !ok(new_sgid)) && !is_superuser())
|
if ((!ok(new_rgid) || !ok(new_egid) || !ok(new_sgid)) && !is_superuser())
|
||||||
return EPERM;
|
return EPERM;
|
||||||
|
|
||||||
|
|
|
@ -724,7 +724,7 @@ bool Thread::WaitBlocker::unblock(Process& process, UnblockFlags flags, u8 signa
|
||||||
// We need to gather the information before we release the scheduler lock!
|
// We need to gather the information before we release the scheduler lock!
|
||||||
siginfo.si_signo = SIGCHLD;
|
siginfo.si_signo = SIGCHLD;
|
||||||
siginfo.si_pid = process.pid().value();
|
siginfo.si_pid = process.pid().value();
|
||||||
siginfo.si_uid = process.uid();
|
siginfo.si_uid = process.uid().value();
|
||||||
siginfo.si_status = signal;
|
siginfo.si_status = signal;
|
||||||
|
|
||||||
switch (flags) {
|
switch (flags) {
|
||||||
|
|
|
@ -344,7 +344,7 @@ void init_stage2(void*)
|
||||||
RefPtr<Thread> thread;
|
RefPtr<Thread> thread;
|
||||||
auto userspace_init = kernel_command_line().userspace_init();
|
auto userspace_init = kernel_command_line().userspace_init();
|
||||||
auto init_args = kernel_command_line().userspace_init_args();
|
auto init_args = kernel_command_line().userspace_init_args();
|
||||||
Process::create_user_process(thread, userspace_init, (uid_t)0, (gid_t)0, ProcessID(0), error, move(init_args), {}, tty0);
|
Process::create_user_process(thread, userspace_init, UserID(0), GroupID(0), ProcessID(0), error, move(init_args), {}, tty0);
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
PANIC("init_stage2: Error spawning SystemServer: {}", error);
|
PANIC("init_stage2: Error spawning SystemServer: {}", error);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue