diff options
Diffstat (limited to 'src/burn/engine/cache.cpp')
-rw-r--r-- | src/burn/engine/cache.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/burn/engine/cache.cpp b/src/burn/engine/cache.cpp index c0ac3ecd..358327a2 100644 --- a/src/burn/engine/cache.cpp +++ b/src/burn/engine/cache.cpp | |||
@@ -106,6 +106,7 @@ static HRESULT SecurePath( | |||
106 | __in LPCWSTR wzPath | 106 | __in LPCWSTR wzPath |
107 | ); | 107 | ); |
108 | static HRESULT CopyEngineToWorkingFolder( | 108 | static HRESULT CopyEngineToWorkingFolder( |
109 | __in BOOL fElevated, | ||
109 | __in BURN_CACHE* pCache, | 110 | __in BURN_CACHE* pCache, |
110 | __in_z LPCWSTR wzSourcePath, | 111 | __in_z LPCWSTR wzSourcePath, |
111 | __in_z LPCWSTR wzWorkingFolderName, | 112 | __in_z LPCWSTR wzWorkingFolderName, |
@@ -330,6 +331,7 @@ LExit: | |||
330 | } | 331 | } |
331 | 332 | ||
332 | extern "C" HRESULT CacheEnsureBaseWorkingFolder( | 333 | extern "C" HRESULT CacheEnsureBaseWorkingFolder( |
334 | __in BOOL fElevated, | ||
333 | __in BURN_CACHE* pCache, | 335 | __in BURN_CACHE* pCache, |
334 | __deref_out_z_opt LPWSTR* psczBaseWorkingFolder | 336 | __deref_out_z_opt LPWSTR* psczBaseWorkingFolder |
335 | ) | 337 | ) |
@@ -338,15 +340,32 @@ extern "C" HRESULT CacheEnsureBaseWorkingFolder( | |||
338 | 340 | ||
339 | HRESULT hr = S_OK; | 341 | HRESULT hr = S_OK; |
340 | LPWSTR sczPotential = NULL; | 342 | LPWSTR sczPotential = NULL; |
343 | PSECURITY_DESCRIPTOR psd = NULL; | ||
344 | LPSECURITY_ATTRIBUTES pWorkingFolderAcl = NULL; | ||
341 | 345 | ||
342 | if (!pCache->fInitializedBaseWorkingFolder) | 346 | if (!pCache->fInitializedBaseWorkingFolder) |
343 | { | 347 | { |
348 | // If elevated, allocate the pWorkingFolderAcl to protect the working folder to only SYSTEM and Admins. | ||
349 | if (fElevated) | ||
350 | { | ||
351 | LPCWSTR wzSddl = L"D:PAI(A;;FA;;;BA)(A;OICIIO;GA;;;BA)(A;;FA;;;SY)(A;OICIIO;GA;;;SY)"; | ||
352 | if (!::ConvertStringSecurityDescriptorToSecurityDescriptorW(wzSddl, SDDL_REVISION_1, &psd, NULL)) | ||
353 | { | ||
354 | ExitWithLastError(hr, "Failed to create the security descriptor for the working folder."); | ||
355 | } | ||
356 | |||
357 | pWorkingFolderAcl = reinterpret_cast<LPSECURITY_ATTRIBUTES>(MemAlloc(sizeof(SECURITY_ATTRIBUTES), TRUE)); | ||
358 | pWorkingFolderAcl->nLength = sizeof(SECURITY_ATTRIBUTES); | ||
359 | pWorkingFolderAcl->lpSecurityDescriptor = psd; | ||
360 | pWorkingFolderAcl->bInheritHandle = FALSE; | ||
361 | } | ||
362 | |||
344 | for (DWORD i = 0; i < pCache->cPotentialBaseWorkingFolders; ++i) | 363 | for (DWORD i = 0; i < pCache->cPotentialBaseWorkingFolders; ++i) |
345 | { | 364 | { |
346 | hr = PathConcatRelativeToFullyQualifiedBase(pCache->rgsczPotentialBaseWorkingFolders[i], pCache->wzGuid, &sczPotential); | 365 | hr = PathConcatRelativeToFullyQualifiedBase(pCache->rgsczPotentialBaseWorkingFolders[i], pCache->wzGuid, &sczPotential); |
347 | if (SUCCEEDED(hr)) | 366 | if (SUCCEEDED(hr)) |
348 | { | 367 | { |
349 | hr = DirEnsureExists(sczPotential, NULL); | 368 | hr = DirEnsureExists(sczPotential, pWorkingFolderAcl); |
350 | if (SUCCEEDED(hr)) | 369 | if (SUCCEEDED(hr)) |
351 | { | 370 | { |
352 | pCache->sczBaseWorkingFolder = sczPotential; | 371 | pCache->sczBaseWorkingFolder = sczPotential; |
@@ -373,6 +392,11 @@ extern "C" HRESULT CacheEnsureBaseWorkingFolder( | |||
373 | } | 392 | } |
374 | 393 | ||
375 | LExit: | 394 | LExit: |
395 | ReleaseMem(pWorkingFolderAcl); | ||
396 | if (psd) | ||
397 | { | ||
398 | ::LocalFree(psd); | ||
399 | } | ||
376 | ReleaseStr(sczPotential); | 400 | ReleaseStr(sczPotential); |
377 | 401 | ||
378 | return hr; | 402 | return hr; |
@@ -888,6 +912,7 @@ extern "C" HRESULT CachePreparePackage( | |||
888 | } | 912 | } |
889 | 913 | ||
890 | extern "C" HRESULT CacheBundleToWorkingDirectory( | 914 | extern "C" HRESULT CacheBundleToWorkingDirectory( |
915 | __in BOOL fElevated, | ||
891 | __in BURN_CACHE* pCache, | 916 | __in BURN_CACHE* pCache, |
892 | __in_z LPCWSTR wzExecutableName, | 917 | __in_z LPCWSTR wzExecutableName, |
893 | __in BURN_SECTION* pSection, | 918 | __in BURN_SECTION* pSection, |
@@ -912,7 +937,7 @@ extern "C" HRESULT CacheBundleToWorkingDirectory( | |||
912 | } | 937 | } |
913 | else // otherwise, carry on putting the bundle in the working folder. | 938 | else // otherwise, carry on putting the bundle in the working folder. |
914 | { | 939 | { |
915 | hr = CopyEngineToWorkingFolder(pCache, sczSourcePath, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName, pSection, psczEngineWorkingPath); | 940 | hr = CopyEngineToWorkingFolder(fElevated, pCache, sczSourcePath, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName, pSection, psczEngineWorkingPath); |
916 | ExitOnFailure(hr, "Failed to copy engine to working folder."); | 941 | ExitOnFailure(hr, "Failed to copy engine to working folder."); |
917 | } | 942 | } |
918 | 943 | ||
@@ -2063,6 +2088,7 @@ LExit: | |||
2063 | 2088 | ||
2064 | 2089 | ||
2065 | static HRESULT CopyEngineToWorkingFolder( | 2090 | static HRESULT CopyEngineToWorkingFolder( |
2091 | __in BOOL fElevated, | ||
2066 | __in BURN_CACHE* pCache, | 2092 | __in BURN_CACHE* pCache, |
2067 | __in_z LPCWSTR wzSourcePath, | 2093 | __in_z LPCWSTR wzSourcePath, |
2068 | __in_z LPCWSTR wzWorkingFolderName, | 2094 | __in_z LPCWSTR wzWorkingFolderName, |
@@ -2079,7 +2105,7 @@ static HRESULT CopyEngineToWorkingFolder( | |||
2079 | LPWSTR sczPayloadSourcePath = NULL; | 2105 | LPWSTR sczPayloadSourcePath = NULL; |
2080 | LPWSTR sczPayloadTargetPath = NULL; | 2106 | LPWSTR sczPayloadTargetPath = NULL; |
2081 | 2107 | ||
2082 | hr = CacheEnsureBaseWorkingFolder(pCache, &sczWorkingFolder); | 2108 | hr = CacheEnsureBaseWorkingFolder(fElevated, pCache, &sczWorkingFolder); |
2083 | ExitOnFailure(hr, "Failed to create working path to copy engine."); | 2109 | ExitOnFailure(hr, "Failed to create working path to copy engine."); |
2084 | 2110 | ||
2085 | hr = PathConcatRelativeToFullyQualifiedBase(sczWorkingFolder, wzWorkingFolderName, &sczTargetDirectory); | 2111 | hr = PathConcatRelativeToFullyQualifiedBase(sczWorkingFolder, wzWorkingFolderName, &sczTargetDirectory); |