VirtualBox

Changeset 96645 in vbox


Ignore:
Timestamp:
Sep 7, 2022 9:25:36 PM (2 years ago)
Author:
vboxsync
Message:

DevATA: Always check that pDevR3->pDrvMount isn't NULL before use.

File:
1 edited

Legend:

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

    r96407 r96645  
    20442044        if (cbBlockRegion == cbATAPISector)
    20452045            rc = pDevR3->pDrvMedia->pfnRead(pDevR3->pDrvMedia, (uint64_t)iATAPILBA * cbATAPISector,
    2046                                        s->abIOBuffer, cbATAPISector * cSectors);
     2046                                            s->abIOBuffer, cbATAPISector * cSectors);
    20472047        else
    20482048        {
     
    23052305            AssertLogRelReturn((uintptr_t)(pbBuf - &s->abIOBuffer[0]) + cbCurrTX <= sizeof(s->abIOBuffer), false);
    23062306            rc = pDevR3->pDrvMedia->pfnSendCmd(pDevR3->pDrvMedia, abATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir,
    2307                                           pbBuf, &cbCurrTX, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */);
     2307                                               pbBuf, &cbCurrTX, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */);
    23082308            if (rc != VINF_SUCCESS)
    23092309                break;
     
    23492349        AssertLogRelReturn(cbTransfer <= sizeof(s->abIOBuffer), false);
    23502350        rc = pDevR3->pDrvMedia->pfnSendCmd(pDevR3->pDrvMedia, s->abATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir,
    2351                                       s->abIOBuffer, &cbTransfer, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */);
     2351                                           s->abIOBuffer, &cbTransfer, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */);
    23522352    }
    23532353    if (pProf) { STAM_PROFILE_ADV_STOP(pProf, b); }
     
    31823182    pbBuf[13] = 0x00; /* no subchannel reads supported */
    31833183    pbBuf[14] = (1 << 0) | (1 << 3) | (1 << 5); /* lock supported, eject supported, tray type loading mechanism */
    3184     if (pDevR3->pDrvMount->pfnIsLocked(pDevR3->pDrvMount))
     3184    if (pDevR3->pDrvMount && pDevR3->pDrvMount->pfnIsLocked(pDevR3->pDrvMount))
    31853185        pbBuf[14] |= 1 << 1; /* report lock state */
    31863186    pbBuf[15] = 0; /* no subchannel reads supported, no separate audio volume control, no changer etc. */
     
    34953495                    atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */
    34963496            }
    3497             else if (pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    3498                 atapiR3CmdOK(pCtl, s);
    34993497            else
    3500                 atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     3498            {
     3499                PPDMIMOUNT const pDrvMount = pDevR3->pDrvMount;
     3500                if (pDrvMount && pDrvMount->pfnIsMounted(pDrvMount))
     3501                    atapiR3CmdOK(pCtl, s);
     3502                else
     3503                    atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     3504            }
    35013505            break;
    35023506        case SCSI_GET_EVENT_STATUS_NOTIFICATION:
     
    35413545            break;
    35423546        case SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL:
    3543             if (pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3547        {
     3548            PPDMIMOUNT const pDrvMount = pDevR3->pDrvMount;
     3549            if (pDrvMount && pDrvMount->pfnIsMounted(pDrvMount))
    35443550            {
    35453551                if (pbPacket[4] & 1)
    3546                     pDevR3->pDrvMount->pfnLock(pDevR3->pDrvMount);
     3552                    pDrvMount->pfnLock(pDrvMount);
    35473553                else
    3548                     pDevR3->pDrvMount->pfnUnlock(pDevR3->pDrvMount);
     3554                    pDrvMount->pfnUnlock(pDrvMount);
    35493555                atapiR3CmdOK(pCtl, s);
    35503556            }
     
    35523558                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
    35533559            break;
     3560        }
    35543561        case SCSI_READ_10:
    35553562        case SCSI_READ_12:
     
    35613568                break;
    35623569            }
    3563             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3570            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    35643571            {
    35653572                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    35813588            VDREGIONDATAFORM enmDataForm = VDREGIONDATAFORM_INVALID;
    35823589            int rc = pDevR3->pDrvMedia->pfnQueryRegionPropertiesForLba(pDevR3->pDrvMedia, iATAPILBA,
    3583                                                                   NULL, NULL, NULL, &enmDataForm);
     3590                                                                       NULL, NULL, NULL, &enmDataForm);
    35843591            if (RT_UNLIKELY(   rc == VERR_NOT_FOUND
    35853592                            || ((uint64_t)iATAPILBA + cSectors > s->cTotalSectors)))
     
    36273634                break;
    36283635            }
    3629             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3636            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    36303637            {
    36313638                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    37313738                break;
    37323739            }
    3733             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3740            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    37343741            {
    37353742                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    37683775                    /* This must be done from EMT. */
    37693776                    PATASTATER3 pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PATASTATER3);
    3770 
    3771                     ataR3LockLeave(pDevIns, pCtl);
    3772                     rc = PDMDevHlpVMReqPriorityCallWait(pDevIns, VMCPUID_ANY,
    3773                                                         (PFNRT)pDevR3->pDrvMount->pfnUnmount, 3,
    3774                                                         pDevR3->pDrvMount, false /*=fForce*/, true /*=fEject*/);
    3775                     Assert(RT_SUCCESS(rc) || rc == VERR_PDM_MEDIA_LOCKED || rc == VERR_PDM_MEDIA_NOT_MOUNTED);
    3776                     if (RT_SUCCESS(rc) && pThisCC->pMediaNotify)
     3777                    PPDMIMOUNT  pDrvMount = pDevR3->pDrvMount;
     3778                    if (pDrvMount)
    37773779                    {
    3778                         rc = PDMDevHlpVMReqCallNoWait(pDevIns, VMCPUID_ANY,
    3779                                                       (PFNRT)pThisCC->pMediaNotify->pfnEjected, 2,
    3780                                                       pThisCC->pMediaNotify, s->iLUN);
    3781                         AssertRC(rc);
     3780                        ataR3LockLeave(pDevIns, pCtl);
     3781
     3782                        rc = PDMDevHlpVMReqPriorityCallWait(pDevIns, VMCPUID_ANY,
     3783                                                            (PFNRT)pDrvMount->pfnUnmount, 3,
     3784                                                            pDrvMount, false /*=fForce*/, true /*=fEject*/);
     3785                        Assert(RT_SUCCESS(rc) || rc == VERR_PDM_MEDIA_LOCKED || rc == VERR_PDM_MEDIA_NOT_MOUNTED);
     3786                        if (RT_SUCCESS(rc) && pThisCC->pMediaNotify)
     3787                        {
     3788                            rc = PDMDevHlpVMReqCallNoWait(pDevIns, VMCPUID_ANY,
     3789                                                          (PFNRT)pThisCC->pMediaNotify->pfnEjected, 2,
     3790                                                          pThisCC->pMediaNotify, s->iLUN);
     3791                            AssertRC(rc);
     3792                        }
     3793
     3794                        ataR3LockEnter(pDevIns, pCtl);
    37823795                    }
    3783 
    3784                     ataR3LockEnter(pDevIns, pCtl);
     3796                    else
     3797                        rc = VINF_SUCCESS;
    37853798                    break;
    37863799                }
     
    38143827                break;
    38153828            }
    3816             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3829            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    38173830            {
    38183831                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    38493862                break;
    38503863            }
    3851             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3864            if (!pDevR3->pDrvMount && !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    38523865            {
    38533866                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    38633876                break;
    38643877            }
    3865             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3878            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    38663879            {
    38673880                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    38783891                break;
    38793892            }
    3880             else if (!pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
     3893            if (!pDevR3->pDrvMount || !pDevR3->pDrvMount->pfnIsMounted(pDevR3->pDrvMount))
    38813894            {
    38823895                atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);
     
    38963909            break;
    38973910        case SCSI_READ_DVD_STRUCTURE:
    3898         {
    38993911            cbMax = scsiBE2H_U16(pbPacket + 8);
    39003912            ataR3StartTransfer(pDevIns, pCtl, s, RT_MIN(cbMax, 4), PDMMEDIATXDIR_FROM_DEVICE, ATAFN_BT_ATAPI_CMD, ATAFN_SS_ATAPI_READ_DVD_STRUCTURE, true);
    39013913            break;
    3902         }
    39033914        default:
    39043915            atapiR3CmdErrorSimple(pCtl, s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);
     
    40684079    {
    40694080        uint64_t cBlocks = 0;
    4070         int rc = pIfR3->pDrvMedia->pfnQueryRegionProperties(pIfR3->pDrvMedia, i, NULL, &cBlocks,
    4071                                                           NULL, NULL);
     4081        int rc = pIfR3->pDrvMedia->pfnQueryRegionProperties(pIfR3->pDrvMedia, i, NULL, &cBlocks, NULL, NULL);
    40724082        AssertRC(rc);
    40734083        pIf->cTotalSectors += cBlocks;
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