From 4ef8fe8794d6dce8ca83eeae5a364eaec11c934e Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Mon, 28 Feb 2022 01:54:21 -0500 Subject: [PATCH] Disk: Predictable behavior for zero length reads --- disk/diskreaddriver.cpp | 3 +++ disk/diskwritedriver.cpp | 3 +++ test/diskdriverreadtest.cpp | 9 +++++++++ test/diskdriverwritetest.cpp | 11 +++++++++++ 4 files changed, 26 insertions(+) diff --git a/disk/diskreaddriver.cpp b/disk/diskreaddriver.cpp index b795dc6..d37e34d 100644 --- a/disk/diskreaddriver.cpp +++ b/disk/diskreaddriver.cpp @@ -6,6 +6,9 @@ using namespace icsneo::Disk; optional ReadDriver::readLogicalDisk(Communication& com, device_eventhandler_t report, uint64_t pos, uint8_t* into, uint64_t amount, std::chrono::milliseconds timeout) { + if(amount == 0) + return 0; + optional ret; // Read into here if we can't read directly into the user buffer diff --git a/disk/diskwritedriver.cpp b/disk/diskwritedriver.cpp index 58b0fd9..fe4ab46 100644 --- a/disk/diskwritedriver.cpp +++ b/disk/diskwritedriver.cpp @@ -9,6 +9,9 @@ const APIEvent::Severity WriteDriver::NonatomicSeverity = APIEvent::Severity::Ev optional WriteDriver::writeLogicalDisk(Communication& com, device_eventhandler_t report, ReadDriver& readDriver, uint64_t pos, const uint8_t* from, uint64_t amount, std::chrono::milliseconds timeout) { + if(amount == 0) + return 0; + optional ret; const uint32_t idealBlockSize = getBlockSizeBounds().second; diff --git a/test/diskdriverreadtest.cpp b/test/diskdriverreadtest.cpp index 1449f20..c6070b8 100644 --- a/test/diskdriverreadtest.cpp +++ b/test/diskdriverreadtest.cpp @@ -11,6 +11,15 @@ TEST_F(DiskDriverTest, Read) { EXPECT_EQ(driver->readCalls, 1u); } +TEST_F(DiskDriverTest, ReadZero) { + uint8_t b = 0xCDu; + const auto amountRead = readLogicalDisk(0, &b, 0); + EXPECT_TRUE(amountRead.has_value()); + EXPECT_EQ(amountRead, 0u); + EXPECT_EQ(b, 0xCDu); + EXPECT_EQ(driver->readCalls, 0u); +} + TEST_F(DiskDriverTest, ReadUnaligned) { std::array buf; buf.fill(0u); diff --git a/test/diskdriverwritetest.cpp b/test/diskdriverwritetest.cpp index 493e14c..1da8435 100644 --- a/test/diskdriverwritetest.cpp +++ b/test/diskdriverwritetest.cpp @@ -12,6 +12,17 @@ TEST_F(DiskDriverTest, Write) { EXPECT_EQ(driver->writeCalls, 1u); } +TEST_F(DiskDriverTest, WriteZero) { + uint8_t b = 0xCDu; + const auto amountWritten = writeLogicalDisk(0, &b, 0); + EXPECT_TRUE(amountWritten.has_value()); + EXPECT_EQ(amountWritten, 0u); + EXPECT_EQ(driver->mockDisk[0], TEST_STRING[0]); + EXPECT_EQ(driver->atomicityChecks, 0u); + EXPECT_EQ(driver->readCalls, 0u); + EXPECT_EQ(driver->writeCalls, 0u); +} + TEST_F(DiskDriverTest, WriteNoAtomicityCheck) { driver->supportsAtomic = false; expectedErrors.push({ APIEvent::Type::AtomicOperationCompletedNonatomically, APIEvent::Severity::EventInfo });