VirtualBox

Changeset 85105 in vbox


Ignore:
Timestamp:
Jul 8, 2020 9:32:18 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
139028
Message:

Storage/VMDK: Some fixes for deletion of files when closing images with multiple extents, bugref:9770

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/VMDK.cpp

    r82968 r85105  
    199199typedef struct VMDKFILE
    200200{
    201     /** Pointer to filename. Local copy. */
     201    /** Pointer to file path. Local copy. */
    202202    const char      *pszFilename;
     203    /** Pointer to base name. Local copy. */
     204    const char      *pszBasename;
    203205    /** File open flags for consistency checking. */
    204206    unsigned         fOpen;
     
    552554 */
    553555static int vmdkFileOpen(PVMDKIMAGE pImage, PVMDKFILE *ppVmdkFile,
    554                         const char *pszFilename, uint32_t fOpen)
     556                        const char *pszBasename, const char *pszFilename, uint32_t fOpen)
    555557{
    556558    int rc = VINF_SUCCESS;
     
    587589        return VERR_NO_MEMORY;
    588590    }
     591
     592    if (pszBasename)
     593    {
     594        pVmdkFile->pszBasename = RTStrDup(pszBasename);
     595        if (!pVmdkFile->pszBasename)
     596        {
     597            RTStrFree((char *)(void *)pVmdkFile->pszFilename);
     598            RTMemFree(pVmdkFile);
     599            *ppVmdkFile = NULL;
     600            return VERR_NO_MEMORY;
     601        }
     602    }
     603
    589604    pVmdkFile->fOpen = fOpen;
    590605
     
    641656
    642657        rc = vdIfIoIntFileClose(pImage->pIfIo, pVmdkFile->pStorage);
    643         if (pVmdkFile->fDelete)
     658
     659        bool fFileDel = pVmdkFile->fDelete;
     660        if (   pVmdkFile->pszBasename
     661            && fFileDel)
     662        {
     663            const char *pszSuffix = RTPathSuffix(pVmdkFile->pszBasename);
     664            if (   RTPathHasPath(pVmdkFile->pszBasename)
     665                || !pszSuffix
     666                || (   strcmp(pszSuffix, ".vmdk")
     667                    && strcmp(pszSuffix, ".bin")
     668                    && strcmp(pszSuffix, ".img")))
     669                fFileDel = false;
     670        }
     671
     672        if (fFileDel)
    644673        {
    645674            int rc2 = vdIfIoIntFileDelete(pImage->pIfIo, pVmdkFile->pszFilename);
     
    647676                rc = rc2;
    648677        }
     678        else if (pVmdkFile->fDelete)
     679            LogRel(("VMDK: Denying deletion of %s\n", pVmdkFile->pszBasename));
    649680        RTStrFree((char *)(void *)pVmdkFile->pszFilename);
     681        if (pVmdkFile->pszBasename)
     682            RTStrFree((char *)(void *)pVmdkFile->pszBasename);
    650683        RTMemFree(pVmdkFile);
    651684    }
     
    31973230                        {
    31983231                            case VMDKETYPE_HOSTED_SPARSE:
    3199                                 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3232                                rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    32003233                                                  VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */));
    32013234                                if (RT_FAILURE(rc))
     
    32233256                            case VMDKETYPE_VMFS:
    32243257                            case VMDKETYPE_FLAT:
    3225                                 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3258                                rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    32263259                                                  VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */));
    32273260                                if (RT_FAILURE(rc))
     
    33023335     */
    33033336    PVMDKFILE pFile;
    3304     int rc = vmdkFileOpen(pImage, &pFile, pImage->pszFilename,
     3337    int rc = vmdkFileOpen(pImage, &pFile, NULL, pImage->pszFilename,
    33053338                          VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */));
    33063339    if (RT_SUCCESS(rc))
     
    33963429        pExtent = &pImage->pExtents[0];
    33973430        /* Create raw disk descriptor file. */
    3398         rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,
     3431        rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename,
    33993432                          VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags,
    34003433                                                     true /* fCreate */));
     
    34203453
    34213454        /* Open flat image, the raw disk. */
    3422         rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3455        rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    34233456                          VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0),
    34243457                                                     false /* fCreate */));
     
    34583491
    34593492        /* Create raw partition descriptor file. */
    3460         rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,
     3493        rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename,
    34613494                          VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags,
    34623495                                                     true /* fCreate */));
     
    35293562
    35303563                /* Create partition table flat image. */
    3531                 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3564                rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    35323565                                  VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0),
    35333566                                                             true /* fCreate */));
     
    35643597
    35653598                    /* Open flat image, the raw partition. */
    3566                     rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3599                    rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    35673600                                      VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0),
    35683601                                                                 false /* fCreate */));
     
    36363669    if (cExtents != 1 || (uImageFlags & VD_IMAGE_FLAGS_FIXED))
    36373670    {
    3638         rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,
     3671        rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename,
    36393672                          VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags,
    36403673                                                     true /* fCreate */));
     
    37093742
    37103743        /* Create file for extent. */
    3711         rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3744        rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    37123745                          VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags,
    37133746                                                     true /* fCreate */));
     
    38623895
    38633896    /* Create file for extent. Make it write only, no reading allowed. */
    3864     rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszFullname,
     3897    rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname,
    38653898                        VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags,
    38663899                                                   true /* fCreate */)
     
    55715604    /* Restore the old descriptor. */
    55725605    PVMDKFILE pFile;
    5573     rc = vmdkFileOpen(pImage, &pFile, pRenameState->pszOldDescName,
     5606    rc = vmdkFileOpen(pImage, &pFile, NULL, pRenameState->pszOldDescName,
    55745607                      VDOpenFlagsToFileOpenFlags(VD_OPEN_FLAGS_NORMAL,
    55755608                                                 false /* fCreate */));
Note: See TracChangeset for help on using the changeset viewer.

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