1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-02 20:22:13 +00:00

Kernel: Make Inode::lookup() return a RefPtr<Inode>

Previously this API would return an InodeIdentifier, which meant that
there was a race in path resolution where an inode could be unlinked
in between finding the InodeIdentifier for a path component, and
actually resolving that to an Inode object.

Attaching a test that would quickly trip an assertion before.

Test: Kernel/path-resolution-race.cpp
This commit is contained in:
Andreas Kling 2020-02-01 09:23:46 +01:00
parent 5aa37f6f5c
commit c44b4d61f3
11 changed files with 50 additions and 36 deletions

View file

@ -169,17 +169,17 @@ size_t DevPtsFSInode::directory_entry_count() const
return 2 + ptys->size();
}
InodeIdentifier DevPtsFSInode::lookup(StringView name)
RefPtr<Inode> DevPtsFSInode::lookup(StringView name)
{
ASSERT(identifier().index() == 1);
if (name == "." || name == "..")
return identifier();
return fs().get_inode(identifier());
bool ok;
unsigned pty_index = name.to_uint(ok);
if (ok && ptys->contains(pty_index)) {
return { fsid(), pty_index_to_inode_index(pty_index) };
return fs().get_inode({ fsid(), pty_index_to_inode_index(pty_index) });
}
return {};