VirtualBox

Changeset 81312 in vbox


Ignore:
Timestamp:
Oct 17, 2019 1:35:50 PM (5 years ago)
Author:
vboxsync
Message:

Storage/DevVirtioSCSI.cpp: Fix sanitizer errors found in virtioScsiCtrl()

File:
1 edited

Legend:

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

    r81308 r81312  
    361361    uint32_t  uEventActual;                                   /** event_actual                                       */
    362362    uint8_t   uResponse;                                      /** response                                           */
    363 }  VIRTIOSCSI_CTRL_AN, *PVIRTIOSCSI_CTRL_AN_T;
     363}  VIRTIOSCSI_CTRL_AN_T, *PVIRTIOSCSI_CTRL_AN_T;
    364364#pragma pack()
     365
     366typedef union virtio_scsi_ctrl_union
     367{
     368    VIRTIOSCSI_CTRL_T      scsiCtrl;
     369    VIRTIOSCSI_CTRL_TMF_T  scsiCtrlTmf;
     370    VIRTIOSCSI_CTRL_AN_T   scsiCtrlAsyncNotify;
     371} VIRTIO_SCSI_CTRL_UNION_T, *PVIRTIO_SCSI_CTRL_UNION_T;
    365372
    366373/**
     
    12531260    RT_NOREF2(pThis, qIdx);
    12541261
    1255     uint8_t  uResponse = VIRTIOSCSI_S_OK;
    1256 
    1257     PVIRTIOSCSI_CTRL_T pScsiCtrl = (PVIRTIOSCSI_CTRL_T)RTMemAlloc(sizeof(PVIRTIOSCSI_CTRL_T));
    1258 
    1259     uint8_t *pb = (uint8_t *)pScsiCtrl;
    1260     for (size_t cb = RT_MIN(pDescChain->cbPhysSend, sizeof(PVIRTIOSCSI_CTRL_T)); cb; )
     1262    uint8_t uResponse = VIRTIOSCSI_S_OK;
     1263
     1264    PVIRTIO_SCSI_CTRL_UNION_T pScsiCtrlUnion =
     1265        (PVIRTIO_SCSI_CTRL_UNION_T)RTMemAlloc(sizeof(VIRTIO_SCSI_CTRL_UNION_T));
     1266
     1267    uint8_t *pb = (uint8_t *)pScsiCtrlUnion;
     1268    for (size_t cb = RT_MIN(pDescChain->cbPhysSend, sizeof(VIRTIO_SCSI_CTRL_UNION_T)); cb; )
    12611269    {
    12621270        size_t cbSeg = cb;
     
    12791287    RTSGBUF reqSegBuf;
    12801288
    1281     switch(pScsiCtrl->uType)
     1289
     1290    switch(pScsiCtrlUnion->scsiCtrl.uType)
    12821291    {
    12831292        case VIRTIOSCSI_T_TMF: /* Task Management Functions */
    12841293        {
    1285             PVIRTIOSCSI_CTRL_TMF_T pScsiCtrlTmf = (PVIRTIOSCSI_CTRL_TMF_T)pScsiCtrl;
    1286             const char *pszTmfTypeText = virtioGetTMFTypeText(pScsiCtrlTmf->uSubtype);
    1287             LogFunc(("%s, VirtIO LUN: %.8Rhxs\n%*sTask Mgt Function: %s (not yet implemented)\n",
    1288                 QUEUENAME(qIdx), pScsiCtrlTmf->uScsiLun,
    1289                 CBQUEUENAME(qIdx) + 18, "", pszTmfTypeText));
    1290             RT_NOREF(pszTmfTypeText);
    1291             switch(pScsiCtrlTmf->uSubtype)
     1294            uint8_t  uTarget  = pScsiCtrlUnion->scsiCtrlTmf.uScsiLun[1];
     1295            uint32_t uScsiLun = (pScsiCtrlUnion->scsiCtrlTmf.uScsiLun[2] << 8
     1296                               | pScsiCtrlUnion->scsiCtrlTmf.uScsiLun[3]) & 0x3fff;
     1297
     1298            if (LogIs3Enabled())
     1299            {
     1300                const char *pszTmfTypeText = virtioGetTMFTypeText(pScsiCtrlUnion->scsiCtrlTmf.uSubtype);
     1301                Log3Func(("[%s] (Target: %d LUN: %d)  Task Mgt Function: %s\n",
     1302                    uTarget, uScsiLun, pszTmfTypeText));
     1303                RT_NOREF(pszTmfTypeText);
     1304            }
     1305
     1306            switch(pScsiCtrlUnion->scsiCtrlTmf.uSubtype)
    12921307            {
    12931308                case VIRTIOSCSI_T_TMF_ABORT_TASK:
     
    13271342        case VIRTIOSCSI_T_AN_QUERY: /* Guest SCSI driver is querying supported async event notifications */
    13281343        {
    1329             PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnQuery = (PVIRTIOSCSI_CTRL_AN_T)pScsiCtrl;
     1344
     1345            PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnQuery = &pScsiCtrlUnion->scsiCtrlAsyncNotify;
     1346
     1347            uint8_t  uTarget  = pScsiCtrlAnQuery->uScsiLun[1];
     1348            uint32_t uScsiLun = (pScsiCtrlAnQuery->uScsiLun[2] << 8 | pScsiCtrlAnQuery->uScsiLun[3]) & 0x3fff;
    13301349
    13311350            uSubscribedEvents &= pScsiCtrlAnQuery->uEventsRequested;
     
    13351354            {
    13361355                char szTypeText[128];
    1337                 virtioGetControlAsyncMaskText(szTypeText, sizeof(szTypeText), pScsiCtrlAnQuery->uEventsRequested);
    1338 
    1339                 LogFunc(("%s, VirtIO LUN: %.8Rhxs\n%*sAsync Query, types: %s\n",
    1340                     QUEUENAME(qIdx), pScsiCtrlAnQuery->uScsiLun, CBQUEUENAME(qIdx) + 30, "", szTypeText));
     1356                virtioGetControlAsyncMaskText(szTypeText, sizeof(szTypeText),
     1357                    pScsiCtrlAnQuery->uEventsRequested);
     1358                Log3Func(("[%s] (Target: %d LUN: %d)  Asyc. Notification Queury: %s\n",
     1359                    uTarget, uScsiLun, szTypeText));
     1360                RT_NOREF(szTypeText);
     1361
    13411362            }
    13421363
     
    13481369        case VIRTIOSCSI_T_AN_SUBSCRIBE: /* Guest SCSI driver is subscribing to async event notification(s) */
    13491370        {
    1350             PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnSubscribe = (PVIRTIOSCSI_CTRL_AN_T)pScsiCtrl;
     1371
     1372            PVIRTIOSCSI_CTRL_AN_T pScsiCtrlAnSubscribe = &pScsiCtrlUnion->scsiCtrlAsyncNotify;
     1373
     1374            uint8_t  uTarget  = pScsiCtrlAnSubscribe->uScsiLun[1];
     1375            uint32_t uScsiLun = (pScsiCtrlAnSubscribe->uScsiLun[2] << 8
     1376                               | pScsiCtrlAnSubscribe->uScsiLun[3]) & 0x3fff;
    13511377
    13521378            if (pScsiCtrlAnSubscribe->uEventsRequested & ~SUBSCRIBABLE_EVENTS)
    1353                 LogFunc(("Unsupported bits in event subscription event mask: 0x%x\n", pScsiCtrlAnSubscribe->uEventsRequested));
     1379                LogFunc(("Unsupported bits in event subscription event mask: 0x%x\n",
     1380                    pScsiCtrlAnSubscribe->uEventsRequested));
    13541381
    13551382            uSubscribedEvents &= pScsiCtrlAnSubscribe->uEventsRequested;
     
    13601387                char szTypeText[128];
    13611388                virtioGetControlAsyncMaskText(szTypeText, sizeof(szTypeText), pScsiCtrlAnSubscribe->uEventsRequested);
    1362 
    1363                 LogFunc(("%s, VirtIO LUN: %.8Rhxs\n%*sAsync Subscribe, types: %s\n",
    1364                     QUEUENAME(qIdx), pScsiCtrlAnSubscribe->uScsiLun, CBQUEUENAME(qIdx) + 30, "", szTypeText));
     1389                Log3Func(("[%s] (Target: %d LUN: %d)  Asyc. Notification Subscribe: %s\n",
     1390                    uTarget, uScsiLun, szTypeText));
     1391                RT_NOREF(szTypeText);
     1392
    13651393            }
    13661394
     
    13801408        }
    13811409        default:
    1382             LogFunc(("Unknown control type extracted from %s: %d\n", QUEUENAME(qIdx), pScsiCtrl->uType));
     1410            LogFunc(("Unknown control type extracted from %s: %d\n",
     1411                QUEUENAME(qIdx),  &pScsiCtrlUnion->scsiCtrl.uType));
    13831412
    13841413            uResponse = VIRTIOSCSI_S_FAILURE;
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