aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/cache.cpp
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-05-02 16:48:40 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-05-11 19:11:19 -0500
commit4e2054b3ee31b2b9fae3269d76e08817a36fb51f (patch)
treee8c1f89225061d1fc253b444f9c3cac50118eeb9 /src/burn/engine/cache.cpp
parent5cb01b477d85920662112d63b5a44b75c03762a9 (diff)
downloadwix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.tar.gz
wix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.tar.bz2
wix-4e2054b3ee31b2b9fae3269d76e08817a36fb51f.zip
Reset the package's cache folder only once.
This behavior makes it work similar to the root package cache folder and avoids performance problems when there are many payloads in the package. #4774
Diffstat (limited to 'src/burn/engine/cache.cpp')
-rw-r--r--src/burn/engine/cache.cpp58
1 files changed, 43 insertions, 15 deletions
diff --git a/src/burn/engine/cache.cpp b/src/burn/engine/cache.cpp
index d1999a0d..02cad4a5 100644
--- a/src/burn/engine/cache.cpp
+++ b/src/burn/engine/cache.cpp
@@ -29,7 +29,8 @@ static HRESULT SecurePerMachineCacheRoot();
29static HRESULT CreateCompletedPath( 29static HRESULT CreateCompletedPath(
30 __in BOOL fPerMachine, 30 __in BOOL fPerMachine,
31 __in LPCWSTR wzCacheId, 31 __in LPCWSTR wzCacheId,
32 __out_z LPWSTR* psczCacheDirectory 32 __in LPCWSTR wzFilePath,
33 __out_z LPWSTR* psczCachePath
33 ); 34 );
34static HRESULT CreateUnverifiedPath( 35static HRESULT CreateUnverifiedPath(
35 __in BOOL fPerMachine, 36 __in BOOL fPerMachine,
@@ -750,6 +751,20 @@ extern "C" BOOL CacheBundleRunningFromCache()
750 return vfRunningFromCache; 751 return vfRunningFromCache;
751} 752}
752 753
754HRESULT CachePreparePackage(
755 __in BURN_PACKAGE* pPackage
756 )
757{
758 HRESULT hr = S_OK;
759
760 if (!pPackage->sczCacheFolder)
761 {
762 hr = CreateCompletedPath(pPackage->fPerMachine, pPackage->sczCacheId, NULL, &pPackage->sczCacheFolder);
763 }
764
765 return hr;
766}
767
753extern "C" HRESULT CacheBundleToCleanRoom( 768extern "C" HRESULT CacheBundleToCleanRoom(
754 __in BURN_SECTION* pSection, 769 __in BURN_SECTION* pSection,
755 __deref_out_z_opt LPWSTR* psczCleanRoomBundlePath 770 __deref_out_z_opt LPWSTR* psczCleanRoomBundlePath
@@ -852,7 +867,7 @@ extern "C" HRESULT CacheCompleteBundle(
852 LPWSTR sczSourceDirectory = NULL; 867 LPWSTR sczSourceDirectory = NULL;
853 LPWSTR sczPayloadSourcePath = NULL; 868 LPWSTR sczPayloadSourcePath = NULL;
854 869
855 hr = CreateCompletedPath(fPerMachine, wzBundleId, &sczTargetDirectory); 870 hr = CreateCompletedPath(fPerMachine, wzBundleId, NULL, &sczTargetDirectory);
856 ExitOnFailure(hr, "Failed to create completed cache path for bundle."); 871 ExitOnFailure(hr, "Failed to create completed cache path for bundle.");
857 872
858 hr = PathConcat(sczTargetDirectory, wzExecutableName, &sczTargetPath); 873 hr = PathConcat(sczTargetDirectory, wzExecutableName, &sczTargetPath);
@@ -957,16 +972,12 @@ extern "C" HRESULT CacheCompletePayload(
957 ) 972 )
958{ 973{
959 HRESULT hr = S_OK; 974 HRESULT hr = S_OK;
960 LPWSTR sczCachedDirectory = NULL;
961 LPWSTR sczCachedPath = NULL; 975 LPWSTR sczCachedPath = NULL;
962 LPWSTR sczUnverifiedPayloadPath = NULL; 976 LPWSTR sczUnverifiedPayloadPath = NULL;
963 977
964 hr = CreateCompletedPath(fPerMachine, wzCacheId, &sczCachedDirectory); 978 hr = CreateCompletedPath(fPerMachine, wzCacheId, pPayload->sczFilePath, &sczCachedPath);
965 ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", wzCacheId); 979 ExitOnFailure(hr, "Failed to get cached path for package with cache id: %ls", wzCacheId);
966 980
967 hr = PathConcat(sczCachedDirectory, pPayload->sczFilePath, &sczCachedPath);
968 ExitOnFailure(hr, "Failed to concat complete cached path.");
969
970 // If the cached file matches what we expected, we're good. 981 // If the cached file matches what we expected, we're good.
971 hr = VerifyFileAgainstPayload(pPayload, sczCachedPath, TRUE, BURN_CACHE_STEP_HASH_TO_SKIP_VERIFY, pfnCacheMessageHandler, pfnProgress, pContext); 982 hr = VerifyFileAgainstPayload(pPayload, sczCachedPath, TRUE, BURN_CACHE_STEP_HASH_TO_SKIP_VERIFY, pfnCacheMessageHandler, pfnProgress, pContext);
972 if (SUCCEEDED(hr)) 983 if (SUCCEEDED(hr))
@@ -1016,7 +1027,6 @@ extern "C" HRESULT CacheCompletePayload(
1016LExit: 1027LExit:
1017 ReleaseStr(sczUnverifiedPayloadPath); 1028 ReleaseStr(sczUnverifiedPayloadPath);
1018 ReleaseStr(sczCachedPath); 1029 ReleaseStr(sczCachedPath);
1019 ReleaseStr(sczCachedDirectory);
1020 1030
1021 return hr; 1031 return hr;
1022} 1032}
@@ -1403,11 +1413,13 @@ LExit:
1403static HRESULT CreateCompletedPath( 1413static HRESULT CreateCompletedPath(
1404 __in BOOL fPerMachine, 1414 __in BOOL fPerMachine,
1405 __in LPCWSTR wzId, 1415 __in LPCWSTR wzId,
1406 __out_z LPWSTR* psczCacheDirectory 1416 __in LPCWSTR wzFilePath,
1417 __out_z LPWSTR* psczCachePath
1407 ) 1418 )
1408{ 1419{
1409 HRESULT hr = S_OK; 1420 HRESULT hr = S_OK;
1410 LPWSTR sczCacheDirectory = NULL; 1421 LPWSTR sczCacheDirectory = NULL;
1422 LPWSTR sczCacheFile = NULL;
1411 1423
1412 if (fPerMachine) 1424 if (fPerMachine)
1413 { 1425 {
@@ -1415,22 +1427,38 @@ static HRESULT CreateCompletedPath(
1415 ExitOnFailure(hr, "Failed to secure per-machine cache root."); 1427 ExitOnFailure(hr, "Failed to secure per-machine cache root.");
1416 } 1428 }
1417 1429
1418 // Get the cache completed path, ensure it exists, and reset any permissions people 1430 // Get the cache completed path.
1419 // might have tried to set on the directory so we inherit the (correct!) security
1420 // permissions from the parent directory.
1421 hr = CacheGetCompletedPath(fPerMachine, wzId, &sczCacheDirectory); 1431 hr = CacheGetCompletedPath(fPerMachine, wzId, &sczCacheDirectory);
1422 ExitOnFailure(hr, "Failed to get cache directory."); 1432 ExitOnFailure(hr, "Failed to get cache directory.");
1423 1433
1434 // Ensure it exists.
1424 hr = DirEnsureExists(sczCacheDirectory, NULL); 1435 hr = DirEnsureExists(sczCacheDirectory, NULL);
1425 ExitOnFailure(hr, "Failed to create cache directory: %ls", sczCacheDirectory); 1436 ExitOnFailure(hr, "Failed to create cache directory: %ls", sczCacheDirectory);
1426 1437
1427 ResetPathPermissions(fPerMachine, sczCacheDirectory); 1438 if (!wzFilePath)
1439 {
1440 // Reset any permissions people might have tried to set on the directory
1441 // so we inherit the (correct!) security permissions from the parent directory.
1442 ResetPathPermissions(fPerMachine, sczCacheDirectory);
1428 1443
1429 *psczCacheDirectory = sczCacheDirectory; 1444 *psczCachePath = sczCacheDirectory;
1430 sczCacheDirectory = NULL; 1445 sczCacheDirectory = NULL;
1446 }
1447 else
1448 {
1449 // Get the cache completed file path.
1450 hr = PathConcat(sczCacheDirectory, wzFilePath, &sczCacheFile);
1451 ExitOnFailure(hr, "Failed to construct cache file.");
1452
1453 // Don't reset permissions here. The payload's package must reset its cache folder when it starts caching.
1454
1455 *psczCachePath = sczCacheFile;
1456 sczCacheFile = NULL;
1457 }
1431 1458
1432LExit: 1459LExit:
1433 ReleaseStr(sczCacheDirectory); 1460 ReleaseStr(sczCacheDirectory);
1461 ReleaseStr(sczCacheFile);
1434 return hr; 1462 return hr;
1435} 1463}
1436 1464