From ec1d063cddd04bd0dad1e5f2d2de671bb1c17e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 27 May 2019 15:54:31 +0200 Subject: [PATCH] ahci: handle partial inquiry requests. * it seems 36 bytes is the length of a short inquiry request, so use that. * also remove a data_length check on SCSI_DIR_IN, a zero value is actually allowed. Change-Id: I6618f59626c2540d95b5a8b900d758ec65b11b24 Reviewed-on: https://review.haiku-os.org/c/1487 Reviewed-by: Adrien Destugues --- src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp index 0ec9a166f9..bf5f662b7d 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -44,6 +44,9 @@ #define RWTRACE(a...) +#define INQUIRY_BASE_LENGTH 36 + + AHCIPort::AHCIPort(AHCIController* controller, int index) : fController(controller), @@ -659,8 +662,8 @@ AHCIPort::ScsiInquiry(scsi_ccb* request) // TODO: Sense ILLEGAL REQUEST + INVALID FIELD IN CDB? gSCSI->finished(request, 1); return; - } else if (request->data_length < sizeof(scsiData)) { - ERROR("invalid request\n"); + } else if (request->data_length < INQUIRY_BASE_LENGTH) { + ERROR("invalid request %" B_PRIu32 "\n", request->data_length); request->subsys_status = SCSI_REQ_ABORTED; gSCSI->finished(request, 1); return; @@ -1158,7 +1161,6 @@ AHCIPort::ScsiExecuteRequest(scsi_ccb* request) ASSERT(request->data_length == 0); break; case SCSI_DIR_IN: - ASSERT(request->data_length > 0); break; case SCSI_DIR_OUT: isWrite = true;