summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem/BlockBasedFileSystem.cpp
diff options
context:
space:
mode:
authorMarco Cutecchia <marco.cutecchia@outlook.it>2023-04-01 19:11:21 +0200
committerAndrew Kaster <andrewdkaster@gmail.com>2023-04-02 12:43:17 -0600
commit1b04c4369012b2d8b5c7d29526a0e00dd71c7742 (patch)
tree38c839b2630740db243137848884435b66d7e376 /Kernel/FileSystem/BlockBasedFileSystem.cpp
parent7375beced3a1b323fe3bbfc46423e576ee401cbc (diff)
downloadserenity-1b04c4369012b2d8b5c7d29526a0e00dd71c7742.zip
Kernel: Initialize DiskCache's buffer before the dirty&clean lists
This commit fixes a kernel panic that happened when unmounting a disk due to an invalid memory access. This was because `DiskCache` initializes two linked lists that use an argument `KBuffer` as the storage for their elements. Since the member `KBuffer` was declared after the two lists, when `DiskCache`'s destructor was called, then `KBuffer`'s destructor was called before the ones of the two lists, causing a page fault in the kernel.
Diffstat (limited to 'Kernel/FileSystem/BlockBasedFileSystem.cpp')
-rw-r--r--Kernel/FileSystem/BlockBasedFileSystem.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/Kernel/FileSystem/BlockBasedFileSystem.cpp b/Kernel/FileSystem/BlockBasedFileSystem.cpp
index 4e78a5d3ed..1dabaecf00 100644
--- a/Kernel/FileSystem/BlockBasedFileSystem.cpp
+++ b/Kernel/FileSystem/BlockBasedFileSystem.cpp
@@ -101,11 +101,14 @@ public:
private:
mutable NonnullRefPtr<BlockBasedFileSystem> m_fs;
+ NonnullOwnPtr<KBuffer> m_cached_block_data;
+
+ // NOTE: m_entries must be declared before m_dirty_list and m_clean_list because their entries are allocated from it.
+ // We need to ensure that the destructors of m_dirty_list and m_clean_list are called before m_entries is destroyed.
+ NonnullOwnPtr<KBuffer> m_entries;
mutable IntrusiveList<&CacheEntry::list_node> m_dirty_list;
mutable IntrusiveList<&CacheEntry::list_node> m_clean_list;
mutable HashMap<BlockBasedFileSystem::BlockIndex, CacheEntry*> m_hash;
- NonnullOwnPtr<KBuffer> m_cached_block_data;
- NonnullOwnPtr<KBuffer> m_entries;
};
BlockBasedFileSystem::BlockBasedFileSystem(OpenFileDescription& file_description)