diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 429c42d7200..2037c753136 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -804,6 +804,24 @@ KResult Ext2FSInode::resize(u64 new_size) set_metadata_dirty(true); m_block_list = move(block_list); + + if (new_size > old_size) { + // If we're growing the inode, make sure we zero out all the new space. + // FIXME: There are definitely more efficient ways to achieve this. + size_t bytes_to_clear = new_size - old_size; + size_t clear_from = old_size; + u8 zero_buffer[PAGE_SIZE]; + memset(zero_buffer, 0, sizeof(zero_buffer)); + while (bytes_to_clear) { + auto nwritten = write_bytes(clear_from, min(sizeof(zero_buffer), bytes_to_clear), UserOrKernelBuffer::for_kernel_buffer(zero_buffer), nullptr); + if (nwritten < 0) + return KResult(-nwritten); + ASSERT(nwritten != 0); + bytes_to_clear -= nwritten; + clear_from += nwritten; + } + } + return KSuccess; }