VirtualBox

Ignore:
Timestamp:
Apr 8, 2024 10:18:11 AM (8 months ago)
Author:
vboxsync
Message:

Devices/Storage/VSCSI: Be more strict when it comes to CDB lengths for individual commands, bugref:10613

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp

    r103902 r104221  
    7070    LogFlowFunc(("CDB: %.*Rhxs Cmd: %s\n", pVScsiReq->cbCDB, pVScsiReq->pbCDB, SCSICmdText(pVScsiReq->pbCDB[0])));
    7171
     72    if (!pVScsiReq->cbCDB)
     73    {
     74        *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     75                                        SCSI_ASC_ILLEGAL_OPCODE, 0x00);
     76        return true;
     77    }
     78
    7279    switch (pVScsiReq->pbCDB[0])
    7380    {
     
    95102        case SCSI_REPORT_LUNS:
    96103        {
     104            if (pVScsiReq->cbCDB < 10)
     105            {
     106                *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     107                                                SCSI_ASC_ILLEGAL_OPCODE, 0x00);
     108                break;
     109            }
     110
    97111            /*
    98112             * If allocation length is less than 16 bytes SPC compliant devices have
     
    130144        case SCSI_REQUEST_SENSE:
    131145        {
     146            if (pVScsiReq->cbCDB < 5)
     147            {
     148                *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     149                                                SCSI_ASC_ILLEGAL_OPCODE, 0x00);
     150                break;
     151            }
     152
    132153            vscsiReqSetXferDir(pVScsiReq, VSCSIXFERDIR_T2I);
    133154            vscsiReqSetXferSize(pVScsiReq, pVScsiReq->pbCDB[4]);
     
    143164        case SCSI_MAINTENANCE_IN:
    144165        {
     166            if (pVScsiReq->cbCDB < 8)
     167            {
     168                *prcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     169                                                   SCSI_ASC_ILLEGAL_OPCODE, 0x00);
     170                break;
     171            }
     172
    145173            if (pVScsiReq->pbCDB[1] == SCSI_MAINTENANCE_IN_REPORT_SUPP_OPC)
    146174            {
     
    377405        {
    378406            PVSCSILUNINT pVScsiLun = pVScsiDevice->papVScsiLun[pVScsiReq->iLun];
    379             rc = pVScsiLun->pVScsiLunDesc->pfnVScsiLunReqProcess(pVScsiLun, pVScsiReq);
     407            PVSCSILUNDESC pVScsiLunDesc = pVScsiLun->pVScsiLunDesc;
     408            uint8_t const bOpc = pVScsiReq->pbCDB[0];
     409            uint8_t const cbCdbMin = pVScsiLunDesc->pacbCdbOpc[bOpc];
     410
     411            /* Fail if the opcode is not supported or the CDB is too short. */
     412            if (   cbCdbMin != VSCSI_LUN_CDB_SZ_INVALID
     413                && pVScsiReq->cbCDB >= cbCdbMin)
     414                rc = pVScsiLunDesc->pfnVScsiLunReqProcess(pVScsiLun, pVScsiReq);
     415            else
     416            {
     417                /*
     418                 * CDB length is smaller than what the LUN expects, respond with an
     419                 * ILLEGAL OPCODE error.
     420                 */
     421                vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST,
     422                                         SCSI_ASC_ILLEGAL_OPCODE, 0x00);
     423
     424                vscsiDeviceReqComplete(pVScsiDevice, pVScsiReq,
     425                                       SCSI_STATUS_CHECK_CONDITION, false, VINF_SUCCESS);
     426            }
    380427        }
    381428        else
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette