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 <[email protected]>
This commit is contained in:
@@ -44,6 +44,9 @@
|
|||||||
#define RWTRACE(a...)
|
#define RWTRACE(a...)
|
||||||
|
|
||||||
|
|
||||||
|
#define INQUIRY_BASE_LENGTH 36
|
||||||
|
|
||||||
|
|
||||||
AHCIPort::AHCIPort(AHCIController* controller, int index)
|
AHCIPort::AHCIPort(AHCIController* controller, int index)
|
||||||
:
|
:
|
||||||
fController(controller),
|
fController(controller),
|
||||||
@@ -659,8 +662,8 @@ AHCIPort::ScsiInquiry(scsi_ccb* request)
|
|||||||
// TODO: Sense ILLEGAL REQUEST + INVALID FIELD IN CDB?
|
// TODO: Sense ILLEGAL REQUEST + INVALID FIELD IN CDB?
|
||||||
gSCSI->finished(request, 1);
|
gSCSI->finished(request, 1);
|
||||||
return;
|
return;
|
||||||
} else if (request->data_length < sizeof(scsiData)) {
|
} else if (request->data_length < INQUIRY_BASE_LENGTH) {
|
||||||
ERROR("invalid request\n");
|
ERROR("invalid request %" B_PRIu32 "\n", request->data_length);
|
||||||
request->subsys_status = SCSI_REQ_ABORTED;
|
request->subsys_status = SCSI_REQ_ABORTED;
|
||||||
gSCSI->finished(request, 1);
|
gSCSI->finished(request, 1);
|
||||||
return;
|
return;
|
||||||
@@ -1158,7 +1161,6 @@ AHCIPort::ScsiExecuteRequest(scsi_ccb* request)
|
|||||||
ASSERT(request->data_length == 0);
|
ASSERT(request->data_length == 0);
|
||||||
break;
|
break;
|
||||||
case SCSI_DIR_IN:
|
case SCSI_DIR_IN:
|
||||||
ASSERT(request->data_length > 0);
|
|
||||||
break;
|
break;
|
||||||
case SCSI_DIR_OUT:
|
case SCSI_DIR_OUT:
|
||||||
isWrite = true;
|
isWrite = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user