mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 07:48:11 +00:00
Ext2FS: Trying to create a too-long directory entry should ENAMETOOLONG
Also added some assertions to DirectoryEntry in case someone tries to instantiate them with names that would overflow the name buffer. DirectoryEntry is a crappy data structure, and the name buffer is also crappy. Added a FIXME about replacing it with something nicer. Before this patch, the DirectoryEntry::name buffer would overflow if you did "touch extremely-long-file-name". Duh. Fixes #538.
This commit is contained in:
parent
ada1f504fd
commit
b9be6b7bb4
3 changed files with 6 additions and 0 deletions
|
@ -767,6 +767,9 @@ KResult Ext2FSInode::add_child(InodeIdentifier child_id, const StringView& name,
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
ASSERT(is_directory());
|
ASSERT(is_directory());
|
||||||
|
|
||||||
|
if (name.length() > EXT2_NAME_LEN)
|
||||||
|
return KResult(-ENAMETOOLONG);
|
||||||
|
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
dbg() << "Ext2FSInode::add_child(): Adding inode " << child_id.index() << " with name '" << name << " and mode " << mode << " to directory " << index();
|
dbg() << "Ext2FSInode::add_child(): Adding inode " << child_id.index() << " with name '" << name << " and mode " << mode << " to directory " << index();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -41,6 +41,7 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, u8 ft)
|
||||||
, inode(i)
|
, inode(i)
|
||||||
, file_type(ft)
|
, file_type(ft)
|
||||||
{
|
{
|
||||||
|
ASSERT(name_length < (int)sizeof(name));
|
||||||
memcpy(name, n, name_length);
|
memcpy(name, n, name_length);
|
||||||
name[name_length] = '\0';
|
name[name_length] = '\0';
|
||||||
}
|
}
|
||||||
|
@ -50,6 +51,7 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, int nl, InodeIdentifier i, u8
|
||||||
, inode(i)
|
, inode(i)
|
||||||
, file_type(ft)
|
, file_type(ft)
|
||||||
{
|
{
|
||||||
|
ASSERT(name_length < (int)sizeof(name));
|
||||||
memcpy(name, n, nl);
|
memcpy(name, n, nl);
|
||||||
name[nl] = '\0';
|
name[nl] = '\0';
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ public:
|
||||||
|
|
||||||
virtual KResult prepare_to_unmount() const { return KSuccess; }
|
virtual KResult prepare_to_unmount() const { return KSuccess; }
|
||||||
|
|
||||||
|
// FIXME: This data structure is very clunky and unpleasant. Replace it with something nicer.
|
||||||
struct DirectoryEntry {
|
struct DirectoryEntry {
|
||||||
DirectoryEntry(const char* name, InodeIdentifier, u8 file_type);
|
DirectoryEntry(const char* name, InodeIdentifier, u8 file_type);
|
||||||
DirectoryEntry(const char* name, int name_length, InodeIdentifier, u8 file_type);
|
DirectoryEntry(const char* name, int name_length, InodeIdentifier, u8 file_type);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue