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:
parent
5aa37f6f5c
commit
c44b4d61f3
11 changed files with 50 additions and 36 deletions
|
@ -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 {};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue