1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 02:47:35 +00:00

Kernel/SysFS: Prevent allocation for component name during construction

Instead, allocate before constructing the object and pass NonnullOwnPtr
of KString to the object if needed. Some classes can determine their
names as they have a known attribute to look for or have a static name.
This commit is contained in:
Liav A 2021-12-12 16:33:08 +02:00 committed by Andreas Kling
parent 4daf07e69f
commit 478f543899
17 changed files with 116 additions and 65 deletions

View file

@ -60,7 +60,6 @@ ErrorOr<void> SysFSRootDirectory::traverse_as_directory(FileSystemID fsid, Funct
}
SysFSRootDirectory::SysFSRootDirectory()
: SysFSDirectory(".")
{
auto buses_directory = SysFSBusDirectory::must_create(*this);
auto devices_directory = SysFSDevicesDirectory::must_create(*this);
@ -252,7 +251,7 @@ UNMAP_AFTER_INIT NonnullRefPtr<SysFSBusDirectory> SysFSBusDirectory::must_create
}
UNMAP_AFTER_INIT SysFSBusDirectory::SysFSBusDirectory(SysFSRootDirectory const& parent_directory)
: SysFSDirectory("bus"sv, parent_directory)
: SysFSDirectory(parent_directory)
{
}

View file

@ -18,6 +18,7 @@ class SysFSRootDirectory final : public SysFSDirectory {
friend class SysFSComponentRegistry;
public:
virtual StringView name() const override { return "."sv; }
static NonnullRefPtr<SysFSRootDirectory> create();
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
@ -33,17 +34,20 @@ class SysFSDeviceComponent final
public:
static NonnullRefPtr<SysFSDeviceComponent> must_create(Device const&);
virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); }
bool is_block_device() const { return m_block_device; }
private:
explicit SysFSDeviceComponent(Device const&);
SysFSDeviceComponent(NonnullOwnPtr<KString> major_minor_formatted_device_name, Device const&);
IntrusiveListNode<SysFSDeviceComponent, NonnullRefPtr<SysFSDeviceComponent>> m_list_node;
bool m_block_device;
NonnullOwnPtr<KString> m_major_minor_formatted_device_name;
};
class SysFSDevicesDirectory final : public SysFSDirectory {
public:
virtual StringView name() const override { return "dev"sv; }
static NonnullRefPtr<SysFSDevicesDirectory> must_create(SysFSRootDirectory const&);
private:
@ -52,6 +56,7 @@ private:
class SysFSBlockDevicesDirectory final : public SysFSDirectory {
public:
virtual StringView name() const override { return "block"sv; }
static NonnullRefPtr<SysFSBlockDevicesDirectory> must_create(SysFSDevicesDirectory const&);
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<SysFSComponent> lookup(StringView name) override;
@ -62,6 +67,7 @@ private:
class SysFSCharacterDevicesDirectory final : public SysFSDirectory {
public:
virtual StringView name() const override { return "char"sv; }
static NonnullRefPtr<SysFSCharacterDevicesDirectory> must_create(SysFSDevicesDirectory const&);
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
virtual RefPtr<SysFSComponent> lookup(StringView name) override;
@ -74,6 +80,7 @@ class SysFSBusDirectory : public SysFSDirectory {
friend class SysFSComponentRegistry;
public:
virtual StringView name() const override { return "bus"sv; }
static NonnullRefPtr<SysFSBusDirectory> must_create(SysFSRootDirectory const&);
private:

View file

@ -20,9 +20,8 @@ static size_t allocate_inode_index()
return s_next_inode_index.value();
}
SysFSComponent::SysFSComponent(StringView name)
: m_name(KString::try_create(name).release_value()) // FIXME: Handle KString allocation failure.
, m_component_index(allocate_inode_index())
SysFSComponent::SysFSComponent()
: m_component_index(allocate_inode_index())
{
}
@ -55,13 +54,8 @@ RefPtr<SysFSComponent> SysFSDirectory::lookup(StringView name)
return {};
}
SysFSDirectory::SysFSDirectory(StringView name)
: SysFSComponent(name)
{
}
SysFSDirectory::SysFSDirectory(StringView name, SysFSDirectory const& parent_directory)
: SysFSComponent(name)
SysFSDirectory::SysFSDirectory(SysFSDirectory const& parent_directory)
: SysFSComponent()
, m_parent_directory(parent_directory)
{
}

View file

@ -25,7 +25,7 @@ struct SysFSInodeData : public OpenFileDescriptionData {
class SysFSComponent : public RefCounted<SysFSComponent> {
public:
virtual StringView name() const { return m_name->view(); }
virtual StringView name() const = 0;
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { return Error::from_errno(ENOTIMPL); }
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); }
virtual RefPtr<SysFSComponent> lookup(StringView) { VERIFY_NOT_REACHED(); };
@ -42,10 +42,9 @@ public:
virtual ~SysFSComponent() = default;
protected:
explicit SysFSComponent(StringView name);
SysFSComponent();
private:
NonnullOwnPtr<KString> m_name;
InodeIndex m_component_index {};
};
@ -57,8 +56,8 @@ public:
virtual ErrorOr<NonnullRefPtr<SysFSInode>> to_inode(SysFS const& sysfs_instance) const override final;
protected:
explicit SysFSDirectory(StringView name);
SysFSDirectory(StringView name, SysFSDirectory const& parent_directory);
SysFSDirectory() = default;
explicit SysFSDirectory(SysFSDirectory const& parent_directory);
NonnullRefPtrVector<SysFSComponent> m_components;
RefPtr<SysFSDirectory> m_parent_directory;
};