From 7c51723a2bbcd0d7ae4c91f890a6bbf9a850f266 Mon Sep 17 00:00:00 2001 From: David Kuder Date: Sat, 11 Jun 2022 11:10:16 -0400 Subject: [PATCH] Import checkBlockCommand from upstream --- src/disk.ino | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/disk.ino b/src/disk.ino index 736153e..e378e46 100755 --- a/src/disk.ino +++ b/src/disk.ino @@ -1,6 +1,31 @@ #include "config.h" #include "scsi_defs.h" +/* + * Check that the image file is present and the block range is valid. + */ +byte checkBlockCommand(uint32_t adds, uint32_t len) +{ + // Check that image file is present + if(!m_sel) { + return STATUS_CHECK; + } + if(!m_sel->m_file.isOpen()) { + m_sel->m_sense.m_key = NOT_READY; // Not ready + m_sel->m_sense.m_code = LUN_NOT_READY; // Logical Unit Not Ready, Manual Intervention Required + m_sel->m_sense.m_key_specific[0] = 0x03; + return STATUS_CHECK; + } + // Check block range is valid + uint32_t bc = m_sel->m_fileSize / m_sel->m_blocksize; + if (adds >= bc || (adds + len) > bc) { + m_sel->m_sense.m_key = 5; // Illegal request + m_sel->m_sense.m_code = INVALID_LBA; // Logical block address out of range + return STATUS_CHECK; + } + return 0x00; +} + void Read6CommandHandler() { LOG("[Read6]"); m_sts |= onReadCommand((((uint32_t)m_cmd[1] & 0x1F) << 16) | ((uint32_t)m_cmd[2] << 8) | m_cmd[3], (m_cmd[4] == 0) ? 0x100 : m_cmd[4]); @@ -28,6 +53,14 @@ void ReadCapacityCommandHandler() { m_phase = PHASE_STATUSIN; return; } + if(!m_sel->m_file.isOpen()) { + m_sts |= STATUS_CHECK; + m_sel->m_sense.m_key = NOT_READY; // Not ready + m_sel->m_sense.m_code = LUN_NOT_READY; // Logical Unit Not Ready, Manual Intervention Required + m_sel->m_sense.m_key_specific[0] = 0x03; + m_phase = PHASE_STATUSIN; + return; + } uint32_t bl = m_sel->m_blocksize; uint32_t bc = m_sel->m_fileSize / bl; @@ -61,12 +94,15 @@ void Seek10CommandHandler() { */ uint8_t onReadCommand(uint32_t adds, uint32_t len) { + uint8_t sts; + LOG("-R "); LOGHEX6(adds); LOG(" "); LOGHEX4N(len); - if(!m_sel) return 0x02; // Image file absent + sts = checkBlockCommand(adds, len); + if(sts) return sts; LED_ON(); writeDataPhaseSD(adds, len); @@ -79,13 +115,16 @@ uint8_t onReadCommand(uint32_t adds, uint32_t len) */ uint8_t onWriteCommand(uint32_t adds, uint32_t len) { + uint8_t sts; + LOG("-W "); LOGHEX6(adds); LOG(" "); LOGHEX4N(len); - if(!m_sel) return 0x02; // Image file absent - + sts = checkBlockCommand(adds, len); + if(sts) return sts; + LED_ON(); readDataPhaseSD(adds, len); LED_OFF();