Changeset 85105 in vbox
- Timestamp:
- Jul 8, 2020 9:32:18 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 139028
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Storage/VMDK.cpp
r82968 r85105 199 199 typedef struct VMDKFILE 200 200 { 201 /** Pointer to file name. Local copy. */201 /** Pointer to file path. Local copy. */ 202 202 const char *pszFilename; 203 /** Pointer to base name. Local copy. */ 204 const char *pszBasename; 203 205 /** File open flags for consistency checking. */ 204 206 unsigned fOpen; … … 552 554 */ 553 555 static int vmdkFileOpen(PVMDKIMAGE pImage, PVMDKFILE *ppVmdkFile, 554 const char *psz Filename, uint32_t fOpen)556 const char *pszBasename, const char *pszFilename, uint32_t fOpen) 555 557 { 556 558 int rc = VINF_SUCCESS; … … 587 589 return VERR_NO_MEMORY; 588 590 } 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 589 604 pVmdkFile->fOpen = fOpen; 590 605 … … 641 656 642 657 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) 644 673 { 645 674 int rc2 = vdIfIoIntFileDelete(pImage->pIfIo, pVmdkFile->pszFilename); … … 647 676 rc = rc2; 648 677 } 678 else if (pVmdkFile->fDelete) 679 LogRel(("VMDK: Denying deletion of %s\n", pVmdkFile->pszBasename)); 649 680 RTStrFree((char *)(void *)pVmdkFile->pszFilename); 681 if (pVmdkFile->pszBasename) 682 RTStrFree((char *)(void *)pVmdkFile->pszBasename); 650 683 RTMemFree(pVmdkFile); 651 684 } … … 3197 3230 { 3198 3231 case VMDKETYPE_HOSTED_SPARSE: 3199 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3232 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3200 3233 VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */)); 3201 3234 if (RT_FAILURE(rc)) … … 3223 3256 case VMDKETYPE_VMFS: 3224 3257 case VMDKETYPE_FLAT: 3225 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3258 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3226 3259 VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */)); 3227 3260 if (RT_FAILURE(rc)) … … 3302 3335 */ 3303 3336 PVMDKFILE pFile; 3304 int rc = vmdkFileOpen(pImage, &pFile, pImage->pszFilename,3337 int rc = vmdkFileOpen(pImage, &pFile, NULL, pImage->pszFilename, 3305 3338 VDOpenFlagsToFileOpenFlags(uOpenFlags, false /* fCreate */)); 3306 3339 if (RT_SUCCESS(rc)) … … 3396 3429 pExtent = &pImage->pExtents[0]; 3397 3430 /* Create raw disk descriptor file. */ 3398 rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,3431 rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename, 3399 3432 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags, 3400 3433 true /* fCreate */)); … … 3420 3453 3421 3454 /* Open flat image, the raw disk. */ 3422 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3455 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3423 3456 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0), 3424 3457 false /* fCreate */)); … … 3458 3491 3459 3492 /* Create raw partition descriptor file. */ 3460 rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,3493 rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename, 3461 3494 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags, 3462 3495 true /* fCreate */)); … … 3529 3562 3530 3563 /* Create partition table flat image. */ 3531 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3564 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3532 3565 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0), 3533 3566 true /* fCreate */)); … … 3564 3597 3565 3598 /* Open flat image, the raw partition. */ 3566 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3599 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3567 3600 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags | ((pExtent->enmAccess == VMDKACCESS_READONLY) ? VD_OPEN_FLAGS_READONLY : 0), 3568 3601 false /* fCreate */)); … … 3636 3669 if (cExtents != 1 || (uImageFlags & VD_IMAGE_FLAGS_FIXED)) 3637 3670 { 3638 rc = vmdkFileOpen(pImage, &pImage->pFile, pImage->pszFilename,3671 rc = vmdkFileOpen(pImage, &pImage->pFile, NULL, pImage->pszFilename, 3639 3672 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags, 3640 3673 true /* fCreate */)); … … 3709 3742 3710 3743 /* Create file for extent. */ 3711 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3744 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3712 3745 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags, 3713 3746 true /* fCreate */)); … … 3862 3895 3863 3896 /* Create file for extent. Make it write only, no reading allowed. */ 3864 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->psz Fullname,3897 rc = vmdkFileOpen(pImage, &pExtent->pFile, pExtent->pszBasename, pExtent->pszFullname, 3865 3898 VDOpenFlagsToFileOpenFlags(pImage->uOpenFlags, 3866 3899 true /* fCreate */) … … 5571 5604 /* Restore the old descriptor. */ 5572 5605 PVMDKFILE pFile; 5573 rc = vmdkFileOpen(pImage, &pFile, pRenameState->pszOldDescName,5606 rc = vmdkFileOpen(pImage, &pFile, NULL, pRenameState->pszOldDescName, 5574 5607 VDOpenFlagsToFileOpenFlags(VD_OPEN_FLAGS_NORMAL, 5575 5608 false /* fCreate */));
Note:
See TracChangeset
for help on using the changeset viewer.