From f08f339e9ae06d3ef30d03f02ffa67ef86b214e2 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 30 Jun 2023 11:22:51 +0300 Subject: [PATCH] Kernel: Return EIO if attached device is gone in StorageDevicePartition The previous code will just do a nullptr-dereference if the underlying device is gone, so instead gracefully return EIO error. --- Kernel/Devices/Storage/StorageDevicePartition.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Kernel/Devices/Storage/StorageDevicePartition.cpp b/Kernel/Devices/Storage/StorageDevicePartition.cpp index 452829d6b0..9b2389c540 100644 --- a/Kernel/Devices/Storage/StorageDevicePartition.cpp +++ b/Kernel/Devices/Storage/StorageDevicePartition.cpp @@ -47,24 +47,30 @@ void StorageDevicePartition::start_request(AsyncBlockDeviceRequest& request) ErrorOr StorageDevicePartition::read(OpenFileDescription& fd, u64 offset, UserOrKernelBuffer& outbuf, size_t len) { + auto device = m_device.strong_ref(); + if (!device) + return Error::from_errno(EIO); // NOTE: The last available offset is actually just after the last addressable block. if (offset >= (m_metadata.end_block() - m_metadata.start_block() + 1) * block_size()) return 0; size_t nread = min(static_cast((m_metadata.end_block() - m_metadata.start_block() + 1) - offset), len); u64 adjust = m_metadata.start_block() * block_size(); dbgln_if(OFFD_DEBUG, "StorageDevicePartition::read offset={}, adjust={}, len={}", fd.offset(), adjust, nread); - return m_device.strong_ref()->read(fd, offset + adjust, outbuf, nread); + return device->read(fd, offset + adjust, outbuf, nread); } ErrorOr StorageDevicePartition::write(OpenFileDescription& fd, u64 offset, UserOrKernelBuffer const& inbuf, size_t len) { + auto device = m_device.strong_ref(); + if (!device) + return Error::from_errno(EIO); // NOTE: The last available offset is actually just after the last addressable block. if (offset >= (m_metadata.end_block() - m_metadata.start_block() + 1) * block_size()) return Error::from_errno(ENOSPC); size_t nwrite = min(static_cast((m_metadata.end_block() - m_metadata.start_block() + 1) - offset), len); u64 adjust = m_metadata.start_block() * block_size(); dbgln_if(OFFD_DEBUG, "StorageDevicePartition::write offset={}, adjust={}, len={}", offset, adjust, nwrite); - return m_device.strong_ref()->write(fd, offset + adjust, inbuf, nwrite); + return device->write(fd, offset + adjust, inbuf, nwrite); } StringView StorageDevicePartition::class_name() const