diff options
Diffstat (limited to 'src/burn/engine/apply.cpp')
| -rw-r--r-- | src/burn/engine/apply.cpp | 73 |
1 files changed, 48 insertions, 25 deletions
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index 283c0ada..0467132e 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
| @@ -191,7 +191,6 @@ static HRESULT DoExecuteAction( | |||
| 191 | __in BURN_ENGINE_STATE* pEngineState, | 191 | __in BURN_ENGINE_STATE* pEngineState, |
| 192 | __in BURN_EXECUTE_ACTION* pExecuteAction, | 192 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
| 193 | __in BURN_EXECUTE_CONTEXT* pContext, | 193 | __in BURN_EXECUTE_CONTEXT* pContext, |
| 194 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary, | ||
| 195 | __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, | 194 | __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, |
| 196 | __out BOOL* pfSuspend, | 195 | __out BOOL* pfSuspend, |
| 197 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | 196 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart |
| @@ -657,8 +656,7 @@ extern "C" HRESULT ApplyExecute( | |||
| 657 | HRESULT hrRollback = S_OK; | 656 | HRESULT hrRollback = S_OK; |
| 658 | BURN_EXECUTE_ACTION_CHECKPOINT* pCheckpoint = NULL; | 657 | BURN_EXECUTE_ACTION_CHECKPOINT* pCheckpoint = NULL; |
| 659 | BURN_EXECUTE_CONTEXT context = { }; | 658 | BURN_EXECUTE_CONTEXT context = { }; |
| 660 | BURN_ROLLBACK_BOUNDARY* pRollbackBoundary = NULL; | 659 | BOOL fSeekRollbackBoundaryEnd = FALSE; |
| 661 | BOOL fSeekNextRollbackBoundary = FALSE; | ||
| 662 | 660 | ||
| 663 | context.pCache = pEngineState->plan.pCache; | 661 | context.pCache = pEngineState->plan.pCache; |
| 664 | context.pUX = &pEngineState->userExperience; | 662 | context.pUX = &pEngineState->userExperience; |
| @@ -680,21 +678,41 @@ extern "C" HRESULT ApplyExecute( | |||
| 680 | continue; | 678 | continue; |
| 681 | } | 679 | } |
| 682 | 680 | ||
| 683 | // If we are seeking the next rollback boundary, skip if this action wasn't it. | 681 | // If we are seeking the end of the rollback boundary, skip if this action wasn't it. |
| 684 | if (fSeekNextRollbackBoundary) | 682 | if (fSeekRollbackBoundaryEnd) |
| 685 | { | 683 | { |
| 686 | if (BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY == pExecuteAction->type) | 684 | if (BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END != pExecuteAction->type) |
| 687 | { | 685 | { |
| 686 | LPCWSTR wzId = NULL; | ||
| 687 | switch (pExecuteAction->type) | ||
| 688 | { | ||
| 689 | case BURN_EXECUTE_ACTION_TYPE_EXE_PACKAGE: | ||
| 690 | wzId = pExecuteAction->exePackage.pPackage->sczId; | ||
| 691 | break; | ||
| 692 | case BURN_EXECUTE_ACTION_TYPE_MSI_PACKAGE: | ||
| 693 | wzId = pExecuteAction->msiPackage.pPackage->sczId; | ||
| 694 | break; | ||
| 695 | case BURN_EXECUTE_ACTION_TYPE_MSP_TARGET: | ||
| 696 | wzId = pExecuteAction->mspTarget.pPackage->sczId; | ||
| 697 | break; | ||
| 698 | case BURN_EXECUTE_ACTION_TYPE_MSU_PACKAGE: | ||
| 699 | wzId = pExecuteAction->msuPackage.pPackage->sczId; | ||
| 700 | break; | ||
| 701 | } | ||
| 702 | |||
| 703 | if (wzId) | ||
| 704 | { | ||
| 705 | LogId(REPORT_WARNING, MSG_APPLY_SKIPPING_NONVITAL_ROLLBACK_BOUNDARY_PACKAGE, wzId); | ||
| 706 | } | ||
| 707 | |||
| 688 | continue; | 708 | continue; |
| 689 | } | 709 | } |
| 690 | else | 710 | |
| 691 | { | 711 | fSeekRollbackBoundaryEnd = FALSE; |
| 692 | fSeekNextRollbackBoundary = FALSE; | ||
| 693 | } | ||
| 694 | } | 712 | } |
| 695 | 713 | ||
| 696 | // Execute the action. | 714 | // Execute the action. |
| 697 | hr = DoExecuteAction(pEngineState, pExecuteAction, &context, &pRollbackBoundary, &pCheckpoint, pfSuspend, pRestart); | 715 | hr = DoExecuteAction(pEngineState, pExecuteAction, &context, &pCheckpoint, pfSuspend, pRestart); |
| 698 | 716 | ||
| 699 | if (*pfSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart) | 717 | if (*pfSuspend || BOOTSTRAPPER_APPLY_RESTART_INITIATED == *pRestart) |
| 700 | { | 718 | { |
| @@ -737,19 +755,24 @@ extern "C" HRESULT ApplyExecute( | |||
| 737 | 755 | ||
| 738 | hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pRestart); | 756 | hrRollback = DoRollbackActions(pEngineState, &context, pCheckpoint->dwId, pRestart); |
| 739 | IgnoreRollbackError(hrRollback, "Failed rollback actions"); | 757 | IgnoreRollbackError(hrRollback, "Failed rollback actions"); |
| 740 | } | ||
| 741 | 758 | ||
| 742 | // If the rollback boundary is vital, end execution here. | 759 | if (pCheckpoint->pActiveRollbackBoundary) |
| 743 | if (pRollbackBoundary && pRollbackBoundary->fVital) | 760 | { |
| 744 | { | 761 | if (pCheckpoint->pActiveRollbackBoundary->fVital) |
| 745 | break; | 762 | { |
| 763 | // If the rollback boundary is vital, end execution here. | ||
| 764 | break; | ||
| 765 | } | ||
| 766 | |||
| 767 | // Move forward to the end of this rollback boundary. | ||
| 768 | fSeekRollbackBoundaryEnd = TRUE; | ||
| 769 | |||
| 770 | LogId(REPORT_WARNING, MSG_APPLY_SKIPPING_REST_OF_NONVITAL_ROLLBACK_BOUNDARY, pCheckpoint->pActiveRollbackBoundary->sczId); | ||
| 771 | } | ||
| 746 | } | 772 | } |
| 747 | 773 | ||
| 748 | // Ignore failure inside of a non-vital rollback boundary. | 774 | // Ignore failure outside of a vital rollback boundary. |
| 749 | hr = S_OK; | 775 | hr = S_OK; |
| 750 | |||
| 751 | // Move forward to next rollback boundary. | ||
| 752 | fSeekNextRollbackBoundary = TRUE; | ||
| 753 | } | 776 | } |
| 754 | } | 777 | } |
| 755 | 778 | ||
| @@ -2207,7 +2230,6 @@ static HRESULT DoExecuteAction( | |||
| 2207 | __in BURN_ENGINE_STATE* pEngineState, | 2230 | __in BURN_ENGINE_STATE* pEngineState, |
| 2208 | __in BURN_EXECUTE_ACTION* pExecuteAction, | 2231 | __in BURN_EXECUTE_ACTION* pExecuteAction, |
| 2209 | __in BURN_EXECUTE_CONTEXT* pContext, | 2232 | __in BURN_EXECUTE_CONTEXT* pContext, |
| 2210 | __inout BURN_ROLLBACK_BOUNDARY** ppRollbackBoundary, | ||
| 2211 | __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, | 2233 | __inout BURN_EXECUTE_ACTION_CHECKPOINT** ppCheckpoint, |
| 2212 | __out BOOL* pfSuspend, | 2234 | __out BOOL* pfSuspend, |
| 2213 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart | 2235 | __out BOOTSTRAPPER_APPLY_RESTART* pRestart |
| @@ -2226,7 +2248,7 @@ static HRESULT DoExecuteAction( | |||
| 2226 | 2248 | ||
| 2227 | do | 2249 | do |
| 2228 | { | 2250 | { |
| 2229 | fInsideMsiTransaction = *ppRollbackBoundary && (*ppRollbackBoundary)->fActiveTransaction; | 2251 | fInsideMsiTransaction = *ppCheckpoint && (*ppCheckpoint)->pActiveRollbackBoundary && (*ppCheckpoint)->pActiveRollbackBoundary->fActiveTransaction; |
| 2230 | 2252 | ||
| 2231 | switch (pExecuteAction->type) | 2253 | switch (pExecuteAction->type) |
| 2232 | { | 2254 | { |
| @@ -2296,8 +2318,9 @@ static HRESULT DoExecuteAction( | |||
| 2296 | 2318 | ||
| 2297 | break; | 2319 | break; |
| 2298 | 2320 | ||
| 2299 | case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY: | 2321 | case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START: __fallthrough; |
| 2300 | *ppRollbackBoundary = pExecuteAction->rollbackBoundary.pRollbackBoundary; | 2322 | case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_END: |
| 2323 | *ppCheckpoint = NULL; | ||
| 2301 | break; | 2324 | break; |
| 2302 | 2325 | ||
| 2303 | case BURN_EXECUTE_ACTION_TYPE_BEGIN_MSI_TRANSACTION: | 2326 | case BURN_EXECUTE_ACTION_TYPE_BEGIN_MSI_TRANSACTION: |
| @@ -2406,7 +2429,7 @@ static HRESULT DoRollbackActions( | |||
| 2406 | IgnoreRollbackError(hr, "Failed to rollback dependency action."); | 2429 | IgnoreRollbackError(hr, "Failed to rollback dependency action."); |
| 2407 | break; | 2430 | break; |
| 2408 | 2431 | ||
| 2409 | case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY: | 2432 | case BURN_EXECUTE_ACTION_TYPE_ROLLBACK_BOUNDARY_START: |
| 2410 | ExitFunction1(hr = S_OK); | 2433 | ExitFunction1(hr = S_OK); |
| 2411 | 2434 | ||
| 2412 | case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE: | 2435 | case BURN_EXECUTE_ACTION_TYPE_UNCACHE_PACKAGE: |
