From 9fbd9288b2edb7e1d41b6e79482a48225d069096 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 31 Dec 2025 20:42:52 +0200 Subject: [PATCH] Kernel: Fix symlink deletion from tmpfs Small symlinks store their target in inline storage of data block indices. Freeing blocks did not account for this and tried to interpret the link target as block inidices to delete --- kernel/kernel/FS/TmpFS/Inode.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/kernel/FS/TmpFS/Inode.cpp b/kernel/kernel/FS/TmpFS/Inode.cpp index a469ce72..d76a5621 100644 --- a/kernel/kernel/FS/TmpFS/Inode.cpp +++ b/kernel/kernel/FS/TmpFS/Inode.cpp @@ -123,6 +123,8 @@ namespace Kernel void TmpInode::free_all_blocks() { + if (mode().iflnk() && m_inode_info.size <= sizeof(TmpInodeInfo::block)) + goto free_all_blocks_done; for (size_t i = 0; i < TmpInodeInfo::direct_block_count; i++) if (m_inode_info.block[i]) m_fs.free_block(m_inode_info.block[i]); @@ -132,6 +134,7 @@ namespace Kernel free_indirect_blocks(block, 2); if (size_t block = m_inode_info.block[TmpInodeInfo::direct_block_count + 2]) free_indirect_blocks(block, 3); + free_all_blocks_done: for (auto& block : m_inode_info.block) block = 0; }