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");