VirtualBox

Changeset 99417 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Apr 17, 2023 12:49:02 PM (21 months ago)
Author:
vboxsync
Message:

Main/NvramStore: Be more careful with exceptions in C-interface routines (PDM,SSM,++) as these are defined to not throw exceptions (via DECLCALLBACK) and try avoid leaking the temporary memory buffer during saving/loading. bugref:10098

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-all/NvramStoreImpl.cpp

    r98262 r99417  
    919919    /*
    920920     * Only store the NVRAM content if the path is not empty, if it is
    921      * this means the VM was just created and the store was nnot saved yet,
     921     * this means the VM was just created and the store was not saved yet,
    922922     * see @bugref{10191}.
    923923     */
     
    931931        AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    932932        if (   m->bd->mapNvram.size() == 1
    933             && m->bd->mapNvram.find(Utf8Str("efi/nvram")) != m->bd->mapNvram.end())
    934         {
    935             RTVFSFILE hVfsFileNvram = m->bd->mapNvram[Utf8Str("efi/nvram")];
     933            && m->bd->mapNvram.begin()->first == "efi/nvram")
     934        {
     935            RTVFSFILE hVfsFileNvram = m->bd->mapNvram.begin()->second;
    936936
    937937            vrc = RTVfsFileSeek(hVfsFileNvram, 0 /*offSeek*/, RTFILE_SEEK_BEGIN, NULL /*poffActual*/);
    938             AssertRC(vrc); RT_NOREF(vrc);
     938            AssertLogRelRC(vrc);
    939939
    940940            RTVFSIOSTREAM hVfsIosDst;
     
    10601060
    10611061#ifndef VBOX_COM_INPROC
     1062
    10621063HRESULT NvramStore::i_retainUefiVarStore(PRTVFS phVfs, bool fReadonly)
    10631064{
     
    12621263}
    12631264
    1264 #else
     1265#else /* VBOX_COM_INPROC */
     1266
    12651267//
    12661268// private methods
     
    12721274    PDRVMAINNVRAMSTORE pThis = RT_FROM_MEMBER(pInterface, DRVMAINNVRAMSTORE, IVfs);
    12731275
     1276    Utf8Str strKey;
     1277    int vrc = strKey.printfNoThrow("%s/%s", pszNamespace, pszPath);
     1278    AssertRCReturn(vrc, vrc);
     1279
    12741280    AutoReadLock rlock(pThis->pNvramStore COMMA_LOCKVAL_SRC_POS);
    1275     NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(Utf8StrFmt("%s/%s", pszNamespace, pszPath));
     1281    NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(strKey);
    12761282    if (it != pThis->pNvramStore->m->bd->mapNvram.end())
    12771283    {
     
    12901296    PDRVMAINNVRAMSTORE pThis = RT_FROM_MEMBER(pInterface, DRVMAINNVRAMSTORE, IVfs);
    12911297
     1298    Utf8Str strKey;
     1299    int vrc = strKey.printfNoThrow("%s/%s", pszNamespace, pszPath);
     1300    AssertRCReturn(vrc, vrc);
     1301
    12921302    AutoReadLock rlock(pThis->pNvramStore COMMA_LOCKVAL_SRC_POS);
    1293     NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(Utf8StrFmt("%s/%s", pszNamespace, pszPath));
     1303    NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(strKey);
    12941304    if (it != pThis->pNvramStore->m->bd->mapNvram.end())
    12951305    {
    12961306        RTVFSFILE hVfsFile = it->second;
    12971307
    1298         int vrc = RTVfsFileSeek(hVfsFile, 0 /*offSeek*/, RTFILE_SEEK_BEGIN, NULL /*poffActual*/);
    1299         AssertRC(vrc); RT_NOREF(vrc);
     1308        vrc = RTVfsFileSeek(hVfsFile, 0 /*offSeek*/, RTFILE_SEEK_BEGIN, NULL /*poffActual*/);
     1309        AssertLogRelRC(vrc);
    13001310
    13011311        return RTVfsFileRead(hVfsFile, pvBuf, cbRead, NULL /*pcbRead*/);
     
    13121322    PDRVMAINNVRAMSTORE pThis = RT_FROM_MEMBER(pInterface, DRVMAINNVRAMSTORE, IVfs);
    13131323
     1324    Utf8Str strKey;
     1325    int vrc = strKey.printfNoThrow("%s/%s", pszNamespace, pszPath);
     1326    AssertRCReturn(vrc, vrc);
     1327
    13141328    AutoWriteLock wlock(pThis->pNvramStore COMMA_LOCKVAL_SRC_POS);
    13151329
    1316     int vrc = VINF_SUCCESS;
    1317     NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(Utf8StrFmt("%s/%s", pszNamespace, pszPath));
     1330    NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(strKey);
    13181331    if (it != pThis->pNvramStore->m->bd->mapNvram.end())
    13191332    {
     
    13211334
    13221335        vrc = RTVfsFileSeek(hVfsFile, 0 /*offSeek*/, RTFILE_SEEK_BEGIN, NULL /*poffActual*/);
    1323         AssertRC(vrc);
     1336        AssertLogRelRC(vrc);
    13241337        vrc = RTVfsFileSetSize(hVfsFile, cbWrite, RTVFSFILE_SIZE_F_NORMAL);
    13251338        if (RT_SUCCESS(vrc))
     
    13321345        vrc = RTVfsFileFromBuffer(RTFILE_O_READ | RTFILE_O_WRITE, pvBuf, cbWrite, &hVfsFile);
    13331346        if (RT_SUCCESS(vrc))
    1334             pThis->pNvramStore->m->bd->mapNvram[Utf8StrFmt("%s/%s", pszNamespace, pszPath)] = hVfsFile;
     1347        {
     1348            try
     1349            {
     1350                pThis->pNvramStore->m->bd->mapNvram[strKey] = hVfsFile;
     1351            }
     1352            catch (...)
     1353            {
     1354                AssertLogRelFailed();
     1355                RTVfsFileRelease(hVfsFile);
     1356                vrc = VERR_UNEXPECTED_EXCEPTION;
     1357            }
     1358        }
    13351359    }
    13361360
     
    13441368    PDRVMAINNVRAMSTORE pThis = RT_FROM_MEMBER(pInterface, DRVMAINNVRAMSTORE, IVfs);
    13451369
     1370    Utf8Str strKey;
     1371    int vrc = strKey.printfNoThrow("%s/%s", pszNamespace, pszPath);
     1372    AssertRCReturn(vrc, vrc);
     1373
    13461374    AutoWriteLock wlock(pThis->pNvramStore COMMA_LOCKVAL_SRC_POS);
    1347     NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(Utf8StrFmt("%s/%s", pszNamespace, pszPath));
     1375    NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.find(strKey);
    13481376    if (it != pThis->pNvramStore->m->bd->mapNvram.end())
    13491377    {
     
    13731401    void *pvData = NULL;
    13741402    size_t cbDataMax = 0;
    1375     NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.begin();
    1376 
    1377     while (it != pThis->pNvramStore->m->bd->mapNvram.end())
     1403    int vrc = i_SsmSaveExecInner(pThis, pHlp, pSSM, &pvData, &cbDataMax);
     1404    if (pvData)
     1405        RTMemFree(pvData);
     1406    AssertRCReturn(vrc, vrc);
     1407
     1408    pThis->pNvramStore->m->fSsmSaved = true;
     1409    return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* sanity/terminator */
     1410}
     1411
     1412
     1413/*static*/
     1414int NvramStore::i_SsmSaveExecInner(PDRVMAINNVRAMSTORE pThis, PCPDMDRVHLPR3 pHlp, PSSMHANDLE pSSM,
     1415                                   void **ppvData, size_t *pcbDataMax) RT_NOEXCEPT
     1416{
     1417    for (NvramStoreIter it = pThis->pNvramStore->m->bd->mapNvram.begin(); it != pThis->pNvramStore->m->bd->mapNvram.end(); ++it)
    13781418    {
    13791419        RTVFSFILE hVfsFile = it->second;
     1420
    13801421        uint64_t cbFile;
    1381 
    13821422        int vrc = RTVfsFileQuerySize(hVfsFile, &cbFile);
    13831423        AssertRCReturn(vrc, vrc);
    13841424        AssertReturn(cbFile < _1M, VERR_OUT_OF_RANGE);
    13851425
    1386         if (cbDataMax < cbFile)
    1387         {
    1388             pvData = RTMemRealloc(pvData, cbFile);
    1389             AssertPtrReturn(pvData, VERR_NO_MEMORY);
    1390             cbDataMax = cbFile;
    1391         }
    1392 
    1393         vrc = RTVfsFileReadAt(hVfsFile, 0 /*off*/, pvData, cbFile, NULL /*pcbRead*/);
     1426        if (*pcbDataMax < cbFile)
     1427        {
     1428            void *pvNew = RTMemRealloc(*ppvData, cbFile);
     1429            AssertPtrReturn(pvNew, VERR_NO_MEMORY);
     1430            *ppvData    = pvNew;
     1431            *pcbDataMax = cbFile;
     1432        }
     1433
     1434        vrc = RTVfsFileReadAt(hVfsFile, 0 /*off*/, *ppvData, cbFile, NULL /*pcbRead*/);
    13941435        AssertRCReturn(vrc, vrc);
    13951436
    13961437        pHlp->pfnSSMPutStrZ(pSSM, it->first.c_str());
    13971438        pHlp->pfnSSMPutU64(pSSM, cbFile);
    1398         pHlp->pfnSSMPutMem(pSSM, pvData, cbFile);
    1399         it++;
    1400     }
    1401 
    1402     if (pvData)
    1403         RTMemFree(pvData);
    1404 
    1405     pThis->pNvramStore->m->fSsmSaved = true;
    1406     return pHlp->pfnSSMPutU32(pSSM, UINT32_MAX); /* sanity/terminator */
     1439        pHlp->pfnSSMPutMem(pSSM, *ppvData, cbFile);
     1440    }
     1441    return VINF_SUCCESS;
    14071442}
    14081443
     
    14391474        void *pvData = NULL;
    14401475        size_t cbDataMax = 0;
    1441         while (cEntries--)
    1442         {
    1443             char szId[_1K]; /* Lazy developer */
    1444             uint64_t cbFile = 0;
    1445 
    1446             vrc = pHlp->pfnSSMGetStrZ(pSSM, &szId[0], sizeof(szId));
    1447             AssertRCReturn(vrc, vrc);
    1448 
    1449             vrc = pHlp->pfnSSMGetU64(pSSM, &cbFile);
    1450             AssertRCReturn(vrc, vrc);
    1451             AssertReturn(cbFile < _1M, VERR_OUT_OF_RANGE);
    1452 
    1453             if (cbDataMax < cbFile)
    1454             {
    1455                 pvData = RTMemRealloc(pvData, cbFile);
    1456                 AssertPtrReturn(pvData, VERR_NO_MEMORY);
    1457                 cbDataMax = cbFile;
    1458             }
    1459 
    1460             vrc = pHlp->pfnSSMGetMem(pSSM, pvData, cbFile);
    1461             AssertRCReturn(vrc, vrc);
    1462 
    1463             RTVFSFILE hVfsFile;
    1464             vrc = RTVfsFileFromBuffer(RTFILE_O_READWRITE, pvData, cbFile, &hVfsFile);
    1465             AssertRCReturn(vrc, vrc);
    1466 
    1467             pThis->pNvramStore->m->bd->mapNvram[Utf8Str(szId)] = hVfsFile;
    1468         }
    1469 
     1476        vrc = i_SsmLoadExecInner(pThis, pHlp, pSSM, cEntries, &pvData, &cbDataMax);
    14701477        if (pvData)
    14711478            RTMemFree(pvData);
     1479        AssertRCReturn(vrc, vrc);
    14721480
    14731481        /* The marker. */
     
    14821490
    14831491
     1492/*static*/
     1493int NvramStore::i_SsmLoadExecInner(PDRVMAINNVRAMSTORE pThis, PCPDMDRVHLPR3 pHlp, PSSMHANDLE pSSM,
     1494                                   uint32_t cEntries, void **ppvData, size_t *pcbDataMax) RT_NOEXCEPT
     1495{
     1496    while (cEntries-- > 0)
     1497    {
     1498        char szId[_1K]; /* Lazy developer */
     1499        int vrc = pHlp->pfnSSMGetStrZ(pSSM, &szId[0], sizeof(szId));
     1500        AssertRCReturn(vrc, vrc);
     1501
     1502        uint64_t cbFile = 0;
     1503        vrc = pHlp->pfnSSMGetU64(pSSM, &cbFile);
     1504        AssertRCReturn(vrc, vrc);
     1505        AssertReturn(cbFile < _1M, VERR_OUT_OF_RANGE);
     1506
     1507        if (*pcbDataMax < cbFile)
     1508        {
     1509            void *pvNew = RTMemRealloc(*ppvData, cbFile);
     1510            AssertPtrReturn(pvNew, VERR_NO_MEMORY);
     1511            *ppvData    = pvNew;
     1512            *pcbDataMax = cbFile;
     1513        }
     1514
     1515        vrc = pHlp->pfnSSMGetMem(pSSM, *ppvData, cbFile);
     1516        AssertRCReturn(vrc, vrc);
     1517
     1518        RTVFSFILE hVfsFile;
     1519        vrc = RTVfsFileFromBuffer(RTFILE_O_READWRITE, *ppvData, cbFile, &hVfsFile);
     1520        AssertRCReturn(vrc, vrc);
     1521
     1522        try
     1523        {
     1524            pThis->pNvramStore->m->bd->mapNvram[Utf8Str(szId)] = hVfsFile;
     1525        }
     1526        catch (...)
     1527        {
     1528            AssertLogRelFailed();
     1529            RTVfsFileRelease(hVfsFile);
     1530            return VERR_UNEXPECTED_EXCEPTION;
     1531        }
     1532    }
     1533
     1534    return VINF_SUCCESS;
     1535}
     1536
     1537
    14841538/**
    14851539 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
     
    15141568            && !pThis->pNvramStore->m->fSsmSaved)
    15151569        {
    1516             int vrc = pThis->pNvramStore->i_saveStore();
    1517             AssertRC(vrc); /** @todo Disk full error? */
     1570            try
     1571            {
     1572                int vrc = pThis->pNvramStore->i_saveStore();
     1573                AssertLogRelRC(vrc); /** @todo Disk full error? */
     1574            }
     1575            catch (...)
     1576            {
     1577                AssertLogRelFailed();
     1578            }
    15181579        }
    15191580    }
     
    15781639    if (cRefs == 1)
    15791640    {
    1580         int vrc = pThis->pNvramStore->i_loadStore(pThis->pNvramStore->m->bd->strNvramPath.c_str());
     1641        int vrc;
     1642        try
     1643        {
     1644            vrc = pThis->pNvramStore->i_loadStore(pThis->pNvramStore->m->bd->strNvramPath.c_str());
     1645        }
     1646        catch (...)
     1647        {
     1648            vrc = VERR_UNEXPECTED_EXCEPTION;
     1649        }
    15811650        if (RT_FAILURE(vrc))
    15821651        {
     
    16411710    PDM_DRVREG_VERSION
    16421711};
    1643 #endif /* !VBOX_COM_INPROC */
     1712
     1713#endif /* VBOX_COM_INPROC */
    16441714
    16451715/* vi: set tabstop=4 shiftwidth=4 expandtab: */
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