mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 18:55:07 +00:00
Kernel/TmpFS: Prevent TmpFS::add_child() from adding duplicate children
If asked to add an already existing name to a directory inode, fail with EEXIST, consistent with other filesystems.
This commit is contained in:
parent
63e8cf8d59
commit
db4388f21b
1 changed files with 7 additions and 1 deletions
|
@ -271,13 +271,19 @@ ErrorOr<void> TmpFSInode::add_child(Inode& child, StringView name, mode_t)
|
||||||
if (name.length() > NAME_MAX)
|
if (name.length() > NAME_MAX)
|
||||||
return ENAMETOOLONG;
|
return ENAMETOOLONG;
|
||||||
|
|
||||||
|
MutexLocker locker(m_inode_lock);
|
||||||
|
for (auto const& existing_child : m_children) {
|
||||||
|
if (existing_child.name->view() == name)
|
||||||
|
return EEXIST;
|
||||||
|
}
|
||||||
|
|
||||||
auto name_kstring = TRY(KString::try_create(name));
|
auto name_kstring = TRY(KString::try_create(name));
|
||||||
// Balanced by `delete` in remove_child()
|
// Balanced by `delete` in remove_child()
|
||||||
|
|
||||||
auto* child_entry = new (nothrow) Child { move(name_kstring), static_cast<TmpFSInode&>(child) };
|
auto* child_entry = new (nothrow) Child { move(name_kstring), static_cast<TmpFSInode&>(child) };
|
||||||
if (!child_entry)
|
if (!child_entry)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
MutexLocker locker(m_inode_lock);
|
|
||||||
m_children.append(*child_entry);
|
m_children.append(*child_entry);
|
||||||
did_add_child(child.identifier(), name);
|
did_add_child(child.identifier(), name);
|
||||||
return {};
|
return {};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue