@joebigelow / wix / commits / 4d0798ec

Always use user's temp directory as basis for acquisition folder.

Fixes #5830

Sean Hall committed Aug 3, 2021 at 18:09 UTC 4d0798ec6311b48bfe6ee3cb4dd41379b4653528
8 files changed +82 -43
src/burn/engine/apply.cpp
+3
@@ -533,6 +533,9 @@ extern "C" HRESULT ApplyCache(
533 hr = UserExperienceOnCacheBegin(pUX);
534 ExitOnRootFailure(hr, "BA aborted cache.");
535
536 + hr = CacheEnsureAcquisitionFolder(pPlan->pCache);
537 + ExitOnFailure(hr, "Failed to ensure acquisition folder.");
538 +
539 cacheContext.hSourceEngineFile = hSourceEngineFile;
540 cacheContext.pCache = pPlan->pCache;
541 cacheContext.pPayloads = pPlan->pPayloads;
src/burn/engine/cache.cpp
+61 -29
@@ -16,9 +16,10 @@ static HRESULT CacheVerifyPayloadSignature(
16 );
17 static HRESULT CalculateBaseWorkingFolder(
18 __in BURN_ENGINE_COMMAND* pInternalCommand,
19 + __in LPCWSTR wzAcquisitionFolder,
20 __inout_z LPWSTR* psczBaseWorkingFolder
21 );
21 -static HRESULT CalculateWorkingFolder(
22 +static HRESULT CalculateWorkingFolders(
23 __in BURN_CACHE* pCache,
24 __in BURN_ENGINE_COMMAND* pInternalCommand
25 );
@@ -214,7 +215,7 @@ extern "C" HRESULT CacheInitialize(
215 ExitOnFailure(hr, "Failed to backslash terminate default %hs package cache directory name.", "per-user");
216
217
217 - hr = CalculateWorkingFolder(pCache, pInternalCommand);
218 + hr = CalculateWorkingFolders(pCache, pInternalCommand);
219
220 pCache->fInitializedCache = TRUE;
221
@@ -309,24 +310,42 @@ LExit:
310 return hr;
311 }
312
312 -extern "C" HRESULT CacheEnsureWorkingFolder(
313 +extern "C" HRESULT CacheEnsureAcquisitionFolder(
314 + __in BURN_CACHE* pCache
315 + )
316 +{
317 + Assert(pCache->fInitializedCache);
318 +
319 + HRESULT hr = S_OK;
320 +
321 + hr = DirEnsureExists(pCache->sczAcquisitionFolder, NULL);
322 + ExitOnFailure(hr, "Failed create acquisition folder.");
323 +
324 + // Best effort to ensure our working folder is not encrypted.
325 + ::DecryptFileW(pCache->sczBaseWorkingFolder, 0);
326 +
327 +LExit:
328 + return hr;
329 +}
330 +
331 +extern "C" HRESULT CacheEnsureBaseWorkingFolder(
332 __in BURN_CACHE* pCache,
314 - __deref_out_z_opt LPWSTR* psczWorkingFolder
333 + __deref_out_z_opt LPWSTR* psczBaseWorkingFolder
334 )
335 {
336 Assert(pCache->fInitializedCache);
337
338 HRESULT hr = S_OK;
339
321 - hr = DirEnsureExists(pCache->sczWorkingFolder, NULL);
340 + hr = DirEnsureExists(pCache->sczBaseWorkingFolder, NULL);
341 ExitOnFailure(hr, "Failed create working folder.");
342
343 // Best effort to ensure our working folder is not encrypted.
325 - ::DecryptFileW(pCache->sczWorkingFolder, 0);
344 + ::DecryptFileW(pCache->sczBaseWorkingFolder, 0);
345
327 - if (psczWorkingFolder)
346 + if (psczBaseWorkingFolder)
347 {
329 - hr = StrAllocString(psczWorkingFolder, pCache->sczWorkingFolder, 0);
348 + hr = StrAllocString(psczBaseWorkingFolder, pCache->sczBaseWorkingFolder, 0);
349 ExitOnFailure(hr, "Failed to copy working folder.");
350 }
351
@@ -353,7 +372,7 @@ extern "C" HRESULT CacheCalculateBundleWorkingPath(
372 }
373 else // Otherwise, use the real working folder.
374 {
356 - hr = StrAllocFormatted(psczWorkingPath, L"%ls%ls\\%ls", pCache->sczWorkingFolder, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName);
375 + hr = StrAllocFormatted(psczWorkingPath, L"%ls%ls\\%ls", pCache->sczBaseWorkingFolder, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName);
376 ExitOnFailure(hr, "Failed to calculate the bundle working path.");
377 }
378
@@ -371,7 +390,7 @@ extern "C" HRESULT CacheCalculateBundleLayoutWorkingPath(
390
391 HRESULT hr = S_OK;
392
374 - hr = PathConcat(pCache->sczWorkingFolder, wzBundleId, psczWorkingPath);
393 + hr = PathConcat(pCache->sczAcquisitionFolder, wzBundleId, psczWorkingPath);
394 ExitOnFailure(hr, "Failed to append bundle id for bundle layout working path.");
395
396 LExit:
@@ -388,7 +407,7 @@ extern "C" HRESULT CacheCalculatePayloadWorkingPath(
407
408 HRESULT hr = S_OK;
409
391 - hr = PathConcat(pCache->sczWorkingFolder, pPayload->sczKey, psczWorkingPath);
410 + hr = PathConcat(pCache->sczAcquisitionFolder, pPayload->sczKey, psczWorkingPath);
411 ExitOnFailure(hr, "Failed to append Id as payload unverified path.");
412
413 LExit:
@@ -405,7 +424,7 @@ extern "C" HRESULT CacheCalculateContainerWorkingPath(
424
425 HRESULT hr = S_OK;
426
408 - hr = PathConcat(pCache->sczWorkingFolder, pContainer->sczHash, psczWorkingPath);
427 + hr = PathConcat(pCache->sczAcquisitionFolder, pContainer->sczHash, psczWorkingPath);
428 ExitOnFailure(hr, "Failed to append hash as container unverified path.");
429
430 LExit:
@@ -1155,7 +1174,7 @@ LExit:
1174 return hr;
1175 }
1176
1158 -extern "C" HRESULT CacheRemoveWorkingFolder(
1177 +extern "C" HRESULT CacheRemoveBaseWorkingFolder(
1178 __in BURN_CACHE* pCache
1179 )
1180 {
@@ -1164,7 +1183,7 @@ extern "C" HRESULT CacheRemoveWorkingFolder(
1183 if (pCache->fInitializedCacheSources)
1184 {
1185 // Try to clean out everything in the working folder.
1167 - hr = DirEnsureDeleteEx(pCache->sczWorkingFolder, DIR_DELETE_FILES | DIR_DELETE_RECURSE | DIR_DELETE_SCHEDULE);
1186 + hr = DirEnsureDeleteEx(pCache->sczBaseWorkingFolder, DIR_DELETE_FILES | DIR_DELETE_RECURSE | DIR_DELETE_SCHEDULE);
1187 TraceError(hr, "Could not delete bundle engine working folder.");
1188 }
1189
@@ -1275,9 +1294,9 @@ extern "C" void CacheCleanup(
1294
1295 if (!fPerMachine)
1296 {
1278 - if (pCache->sczWorkingFolder)
1297 + if (pCache->sczAcquisitionFolder)
1298 {
1280 - hr = PathConcat(pCache->sczWorkingFolder, L"*.*", &sczFiles);
1299 + hr = PathConcat(pCache->sczAcquisitionFolder, L"*.*", &sczFiles);
1300 if (SUCCEEDED(hr))
1301 {
1302 hFind = ::FindFirstFileW(sczFiles, &wfd);
@@ -1299,7 +1318,7 @@ extern "C" void CacheCleanup(
1318 continue;
1319 }
1320
1302 - hr = PathConcatCch(pCache->sczWorkingFolder, 0, wfd.cFileName, cchFileName, &sczDelete);
1321 + hr = PathConcatCch(pCache->sczAcquisitionFolder, 0, wfd.cFileName, cchFileName, &sczDelete);
1322 if (SUCCEEDED(hr))
1323 {
1324 hr = FileEnsureDelete(sczDelete);
@@ -1327,7 +1346,8 @@ extern "C" void CacheUninitialize(
1346 ReleaseNullStr(pCache->sczCurrentMachinePackageCache);
1347 ReleaseNullStr(pCache->sczDefaultMachinePackageCache);
1348 ReleaseNullStr(pCache->sczDefaultUserPackageCache);
1330 - ReleaseNullStr(pCache->sczWorkingFolder);
1349 + ReleaseNullStr(pCache->sczBaseWorkingFolder);
1350 + ReleaseNullStr(pCache->sczAcquisitionFolder);
1351 ReleaseNullStr(pCache->sczSourceProcessFolder);
1352
1353 pCache->fRunningFromCache = FALSE;
@@ -1343,6 +1363,7 @@ extern "C" void CacheUninitialize(
1363
1364 static HRESULT CalculateBaseWorkingFolder(
1365 __in BURN_ENGINE_COMMAND* pInternalCommand,
1366 + __in LPCWSTR wzAcquisitionFolder,
1367 __inout_z LPWSTR* psczBaseWorkingFolder
1368 )
1369 {
@@ -1351,10 +1372,10 @@ static HRESULT CalculateBaseWorkingFolder(
1372 ReleaseNullStr(*psczBaseWorkingFolder);
1373
1374 // The value from the command line takes precedence.
1354 - if (pInternalCommand->sczWorkingDirectory)
1375 + if (pInternalCommand->sczEngineWorkingDirectory)
1376 {
1356 - hr = PathExpand(psczBaseWorkingFolder, pInternalCommand->sczWorkingDirectory, PATH_EXPAND_FULLPATH);
1357 - ExitOnFailure(hr, "Failed to expand engine working directory from command-line: '%ls'", pInternalCommand->sczWorkingDirectory);
1377 + hr = PathExpand(psczBaseWorkingFolder, pInternalCommand->sczEngineWorkingDirectory, PATH_EXPAND_FULLPATH);
1378 + ExitOnFailure(hr, "Failed to expand engine working directory from command-line: '%ls'", pInternalCommand->sczEngineWorkingDirectory);
1379
1380 ExitFunction();
1381 }
@@ -1373,34 +1394,41 @@ static HRESULT CalculateBaseWorkingFolder(
1394 }
1395 }
1396
1376 - // Default to the temp path specified in environment variables, but need to use system temp path for security reasons if running elevated.
1397 + // Default to the acquisition folder, but need to use system temp path for security reasons if running elevated.
1398 if (pInternalCommand->fInitiallyElevated)
1399 {
1400 hr = PathGetSystemTempPath(psczBaseWorkingFolder);
1380 - ExitOnFailure(hr, "Failed to get system temp folder path for working folder.");
1401 + ExitOnFailure(hr, "Failed to get system temp folder path for base working folder.");
1402 }
1403 else
1404 {
1384 - hr = PathGetTempPath(psczBaseWorkingFolder);
1385 - ExitOnFailure(hr, "Failed to get temp folder path for working folder.");
1405 + hr = StrAllocString(psczBaseWorkingFolder, wzAcquisitionFolder, 0);
1406 + ExitOnFailure(hr, "Failed to copy acquisition folder path for base working folder.");
1407 }
1408
1409 LExit:
1410 return hr;
1411 }
1412
1392 -static HRESULT CalculateWorkingFolder(
1413 +static HRESULT CalculateWorkingFolders(
1414 __in BURN_CACHE* pCache,
1415 __in BURN_ENGINE_COMMAND* pInternalCommand
1416 )
1417 {
1418 HRESULT hr = S_OK;
1419 RPC_STATUS rs = RPC_S_OK;
1420 + LPWSTR sczBaseAcquisitionPath = NULL;
1421 LPWSTR sczTempPath = NULL;
1422 UUID guid = {};
1423 WCHAR wzGuid[39];
1424
1403 - hr = CalculateBaseWorkingFolder(pInternalCommand, &sczTempPath);
1425 + hr = PathGetTempPath(&sczBaseAcquisitionPath);
1426 + ExitOnFailure(hr, "Failed to get temp folder path for acquisition folder base.");
1427 +
1428 + hr = PathBackslashTerminate(&sczBaseAcquisitionPath);
1429 + ExitOnFailure(hr, "Failed to backslashify base engine working directory.");
1430 +
1431 + hr = CalculateBaseWorkingFolder(pInternalCommand, sczBaseAcquisitionPath, &sczTempPath);
1432 ExitOnFailure(hr, "Failed to get base engine working directory.");
1433
1434 hr = PathBackslashTerminate(&sczTempPath);
@@ -1416,10 +1444,14 @@ static HRESULT CalculateWorkingFolder(
1444 ExitOnRootFailure(hr, "Failed to convert working folder guid into string.");
1445 }
1446
1419 - hr = StrAllocFormatted(&pCache->sczWorkingFolder, L"%ls%ls\\", sczTempPath, wzGuid);
1447 + hr = StrAllocFormatted(&pCache->sczAcquisitionFolder, L"%ls%ls\\", sczBaseAcquisitionPath, wzGuid);
1448 + ExitOnFailure(hr, "Failed to append random guid on to temp path for acquisition folder.");
1449 +
1450 + hr = StrAllocFormatted(&pCache->sczBaseWorkingFolder, L"%ls%ls\\", sczTempPath, wzGuid);
1451 ExitOnFailure(hr, "Failed to append random guid on to temp path for working folder.");
1452
1453 LExit:
1454 + ReleaseStr(sczBaseAcquisitionPath);
1455 ReleaseStr(sczTempPath);
1456
1457 return hr;
@@ -2020,7 +2052,7 @@ static HRESULT CopyEngineToWorkingFolder(
2052 LPWSTR sczPayloadSourcePath = NULL;
2053 LPWSTR sczPayloadTargetPath = NULL;
2054
2023 - hr = CacheEnsureWorkingFolder(pCache, &sczWorkingFolder);
2055 + hr = CacheEnsureBaseWorkingFolder(pCache, &sczWorkingFolder);
2056 ExitOnFailure(hr, "Failed to create working path to copy engine.");
2057
2058 hr = PathConcat(sczWorkingFolder, wzWorkingFolderName, &sczTargetDirectory);
src/burn/engine/cache.h
+8 -4
@@ -39,7 +39,8 @@ typedef struct _BURN_CACHE
39 BOOL fInitializedCacheSources;
40 BOOL fRunningFromCache;
41 LPWSTR sczSourceProcessFolder;
42 - LPWSTR sczWorkingFolder;
42 + LPWSTR sczAcquisitionFolder;
43 + LPWSTR sczBaseWorkingFolder;
44 } BURN_CACHE;
45
46 typedef struct _BURN_CACHE_MESSAGE
@@ -80,9 +81,12 @@ HRESULT CacheInitializeSources(
81 __in BURN_VARIABLES* pVariables,
82 __in BURN_ENGINE_COMMAND* pInternalCommand
83 );
83 -HRESULT CacheEnsureWorkingFolder(
84 +HRESULT CacheEnsureAcquisitionFolder(
85 + __in BURN_CACHE* pCache
86 + );
87 +HRESULT CacheEnsureBaseWorkingFolder(
88 __in BURN_CACHE* pCache,
85 - __deref_out_z_opt LPWSTR* psczWorkingFolder
89 + __deref_out_z_opt LPWSTR* psczBaseWorkingFolder
90 );
91 HRESULT CacheCalculateBundleWorkingPath(
92 __in BURN_CACHE* pCache,
@@ -228,7 +232,7 @@ HRESULT CacheVerifyPayload(
232 __in LPPROGRESS_ROUTINE pfnProgress,
233 __in LPVOID pContext
234 );
231 -HRESULT CacheRemoveWorkingFolder(
235 +HRESULT CacheRemoveBaseWorkingFolder(
236 __in BURN_CACHE* pCache
237 );
238 HRESULT CacheRemoveBundle(
src/burn/engine/core.cpp
+4 -4
@@ -229,7 +229,7 @@ extern "C" HRESULT CoreInitializeConstants(
229 {
230 // Pass along any ancestors and ourself to prevent infinite loops.
231 pPackage->Exe.wzAncestors = pRegistration->sczBundlePackageAncestors;
232 - pPackage->Exe.wzEngineWorkingDirectory = pInternalCommand->sczWorkingDirectory;
232 + pPackage->Exe.wzEngineWorkingDirectory = pInternalCommand->sczEngineWorkingDirectory;
233 }
234 }
235
@@ -1019,7 +1019,7 @@ static HRESULT CoreRecreateCommandLine(
1019 ExitOnFailure(hr, "Failed to append ancestors to command-line.");
1020 }
1021
1022 - hr = CoreAppendEngineWorkingDirectoryToCommandLine(pInternalCommand->sczWorkingDirectory, psczCommandLine, NULL);
1022 + hr = CoreAppendEngineWorkingDirectoryToCommandLine(pInternalCommand->sczEngineWorkingDirectory, psczCommandLine, NULL);
1023 ExitOnFailure(hr, "Failed to append the custom working directory to command-line.");
1024
1025 if (wzRelationTypeCommandLine)
@@ -1733,12 +1733,12 @@ extern "C" HRESULT CoreParseCommandLine(
1733 else if (L'\0' == wzParam[1])
1734 {
1735 // Need to grab the current directory here since this is passed on to other processes.
1736 - hr = DirGetCurrent(&pInternalCommand->sczWorkingDirectory);
1736 + hr = DirGetCurrent(&pInternalCommand->sczEngineWorkingDirectory);
1737 ExitOnFailure(hr, "Failed to get current directory for custom working directory.");
1738 }
1739 else
1740 {
1741 - hr = StrAllocString(&pInternalCommand->sczWorkingDirectory, wzParam + 1, 0);
1741 + hr = StrAllocString(&pInternalCommand->sczEngineWorkingDirectory, wzParam + 1, 0);
1742 ExitOnFailure(hr, "Failed to allocate the custom working directory.");
1743 }
1744 }
src/burn/engine/core.h
+2 -2
@@ -14,7 +14,7 @@ const LPCWSTR BURN_POLICY_REGISTRY_PATH = L"WiX\\Burn";
14 const LPCWSTR BURN_COMMANDLINE_SWITCH_PARENT = L"parent";
15 const LPCWSTR BURN_COMMANDLINE_SWITCH_PARENT_NONE = L"parent:none";
16 const LPCWSTR BURN_COMMANDLINE_SWITCH_CLEAN_ROOM = L"burn.clean.room";
17 -const LPCWSTR BURN_COMMANDLINE_SWITCH_WORKING_DIRECTORY = L"burn.working.directory";
17 +const LPCWSTR BURN_COMMANDLINE_SWITCH_WORKING_DIRECTORY = L"burn.engine.working.directory";
18 const LPCWSTR BURN_COMMANDLINE_SWITCH_ELEVATED = L"burn.elevated";
19 const LPCWSTR BURN_COMMANDLINE_SWITCH_EMBEDDED = L"burn.embedded";
20 const LPCWSTR BURN_COMMANDLINE_SWITCH_RUNONCE = L"burn.runonce";
@@ -100,7 +100,7 @@ typedef struct _BURN_ENGINE_COMMAND
100
101 LPWSTR sczSourceProcessPath;
102 LPWSTR sczOriginalSource;
103 - LPWSTR sczWorkingDirectory;
103 + LPWSTR sczEngineWorkingDirectory;
104
105 DWORD dwLoggingAttributes;
106 LPWSTR sczLogFile;
src/burn/engine/engine.cpp
+2 -2
@@ -246,7 +246,7 @@ LExit:
246
247 UserExperienceRemove(&engineState.userExperience);
248
249 - CacheRemoveWorkingFolder(&engineState.cache);
249 + CacheRemoveBaseWorkingFolder(&engineState.cache);
250 CacheUninitialize(&engineState.cache);
251
252 // If this is a related bundle (but not an update) suppress restart and return the standard restart error code.
@@ -401,7 +401,7 @@ static void UninitializeEngineState(
401 ReleaseStr(pEngineState->internalCommand.sczLogFile);
402 ReleaseStr(pEngineState->internalCommand.sczOriginalSource);
403 ReleaseStr(pEngineState->internalCommand.sczSourceProcessPath);
404 - ReleaseStr(pEngineState->internalCommand.sczWorkingDirectory);
404 + ReleaseStr(pEngineState->internalCommand.sczEngineWorkingDirectory);
405
406 ReleaseStr(pEngineState->log.sczExtension);
407 ReleaseStr(pEngineState->log.sczPrefix);
src/burn/engine/plan.cpp
+1 -1
@@ -1283,7 +1283,7 @@ extern "C" HRESULT PlanRelatedBundlesBegin(
1283
1284 // Pass along any ancestors and ourself to prevent infinite loops.
1285 pRelatedBundle->package.Exe.wzAncestors = pRegistration->sczBundlePackageAncestors;
1286 - pRelatedBundle->package.Exe.wzEngineWorkingDirectory = pPlan->pInternalCommand->sczWorkingDirectory;
1286 + pRelatedBundle->package.Exe.wzEngineWorkingDirectory = pPlan->pInternalCommand->sczEngineWorkingDirectory;
1287
1288 hr = PlanDefaultRelatedBundleRequestState(relationType, pRelatedBundle->relationType, pPlan->action, pRegistration->pVersion, pRelatedBundle->pVersion, &pRelatedBundle->package.requested);
1289 ExitOnFailure(hr, "Failed to get default request state for related bundle.");
src/burn/engine/userexperience.cpp
+1 -1
@@ -168,7 +168,7 @@ extern "C" HRESULT UserExperienceEnsureWorkingFolder(
168 HRESULT hr = S_OK;
169 LPWSTR sczWorkingFolder = NULL;
170
171 - hr = CacheEnsureWorkingFolder(pCache, &sczWorkingFolder);
171 + hr = CacheEnsureBaseWorkingFolder(pCache, &sczWorkingFolder);
172 ExitOnFailure(hr, "Failed to create working folder.");
173
174 hr = StrAllocFormatted(psczUserExperienceWorkingFolder, L"%ls%ls\\", sczWorkingFolder, L".ba");