From b9be6b7bb4866cf73d48f64a6a0b80164a22a550 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 10 Sep 2019 21:04:27 +0200 Subject: [PATCH] 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. --- Kernel/FileSystem/Ext2FileSystem.cpp | 3 +++ Kernel/FileSystem/FileSystem.cpp | 2 ++ Kernel/FileSystem/FileSystem.h | 1 + 3 files changed, 6 insertions(+) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 20b1d307ff..9132fc181e 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -767,6 +767,9 @@ KResult Ext2FSInode::add_child(InodeIdentifier child_id, const StringView& name, LOCKER(m_lock); ASSERT(is_directory()); + if (name.length() > EXT2_NAME_LEN) + return KResult(-ENAMETOOLONG); + #ifdef EXT2_DEBUG dbg() << "Ext2FSInode::add_child(): Adding inode " << child_id.index() << " with name '" << name << " and mode " << mode << " to directory " << index(); #endif diff --git a/Kernel/FileSystem/FileSystem.cpp b/Kernel/FileSystem/FileSystem.cpp index c0c612c9c9..bae0038a52 100644 --- a/Kernel/FileSystem/FileSystem.cpp +++ b/Kernel/FileSystem/FileSystem.cpp @@ -41,6 +41,7 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, u8 ft) , inode(i) , file_type(ft) { + ASSERT(name_length < (int)sizeof(name)); memcpy(name, n, name_length); name[name_length] = '\0'; } @@ -50,6 +51,7 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, int nl, InodeIdentifier i, u8 , inode(i) , file_type(ft) { + ASSERT(name_length < (int)sizeof(name)); memcpy(name, n, nl); name[nl] = '\0'; } diff --git a/Kernel/FileSystem/FileSystem.h b/Kernel/FileSystem/FileSystem.h index 31f7f51a73..fa43ba58bc 100644 --- a/Kernel/FileSystem/FileSystem.h +++ b/Kernel/FileSystem/FileSystem.h @@ -47,6 +47,7 @@ public: virtual KResult prepare_to_unmount() const { return KSuccess; } + // FIXME: This data structure is very clunky and unpleasant. Replace it with something nicer. struct DirectoryEntry { DirectoryEntry(const char* name, InodeIdentifier, u8 file_type); DirectoryEntry(const char* name, int name_length, InodeIdentifier, u8 file_type);