From 02f05436fc5c30c8dee84da37c89ec4c462bf25b Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 13 Jul 2026 07:43:07 +0300 Subject: [PATCH] Kernel: Fix zero sized reads from a partition --- kernel/kernel/Storage/Partition.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/kernel/kernel/Storage/Partition.cpp b/kernel/kernel/Storage/Partition.cpp index 036da0f6..1765521b 100644 --- a/kernel/kernel/Storage/Partition.cpp +++ b/kernel/kernel/Storage/Partition.cpp @@ -79,17 +79,19 @@ namespace Kernel if (!device) return BAN::Error::from_errno(ENODEV); - if (offset % device->blksize() || buffer.size() % device->blksize()) - return BAN::Error::from_errno(ENOTSUP); + if (offset < 0 || offset % device->blksize()) + return BAN::Error::from_errno(EINVAL); - const uint32_t blocks_in_partition = m_last_block - m_first_block + 1; - uint32_t first_block = offset / device->blksize(); - uint32_t block_count = buffer.size() / device->blksize(); + const uint64_t blocks_in_partition = m_last_block - m_first_block + 1; + const uint64_t first_block = offset / device->blksize(); + uint64_t block_count = buffer.size() / device->blksize(); if (first_block >= blocks_in_partition) return 0; if (first_block + block_count > blocks_in_partition) block_count = blocks_in_partition - first_block; + if (block_count == 0) + return 0; TRY(read_blocks(first_block, block_count, buffer)); return block_count * device->blksize();