aboutsummaryrefslogtreecommitdiff
path: root/src/burn
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2022-05-13 13:50:50 -0500
committerSean Hall <r.sean.hall@gmail.com>2022-05-14 11:12:31 -0500
commit6a6974a15deb6edf593736cdb8043bfb93064782 (patch)
tree0ae2afffcd02967ba3fe0f0a5d3e9273811f1e6f /src/burn
parent7d56566b7c51c49ded526466dfae6af9e1709040 (diff)
downloadwix-6a6974a15deb6edf593736cdb8043bfb93064782.tar.gz
wix-6a6974a15deb6edf593736cdb8043bfb93064782.tar.bz2
wix-6a6974a15deb6edf593736cdb8043bfb93064782.zip
Move infinite loop detection into the hosts.
Tell the BA during Destroy whether it will be reloaded, and let the BA decide then whether it's module should be unloaded. Show error when infinite prereq loop detected. Only clip the exit code if they're Win32 errors. Set related bundle type to none to avoid downgrades during preqba.
Diffstat (limited to 'src/burn')
-rw-r--r--src/burn/engine/engine.cpp4
-rw-r--r--src/burn/engine/userexperience.cpp15
-rw-r--r--src/burn/engine/userexperience.h4
3 files changed, 15 insertions, 8 deletions
diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp
index ee848acf..a408ed4a 100644
--- a/src/burn/engine/engine.cpp
+++ b/src/burn/engine/engine.cpp
@@ -796,7 +796,7 @@ LExit:
796 else if (BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER == shutdownAction) 796 else if (BOOTSTRAPPER_SHUTDOWN_ACTION_RELOAD_BOOTSTRAPPER == shutdownAction)
797 { 797 {
798 LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RELOAD); 798 LogId(REPORT_STANDARD, MSG_BA_REQUESTED_RELOAD);
799 *pfReloadApp = TRUE; 799 *pfReloadApp = SUCCEEDED(hr);
800 } 800 }
801 else if (BOOTSTRAPPER_SHUTDOWN_ACTION_SKIP_CLEANUP == shutdownAction) 801 else if (BOOTSTRAPPER_SHUTDOWN_ACTION_SKIP_CLEANUP == shutdownAction)
802 { 802 {
@@ -806,7 +806,7 @@ LExit:
806 } 806 }
807 807
808 // Unload BA. 808 // Unload BA.
809 UserExperienceUnload(&pEngineState->userExperience); 809 UserExperienceUnload(&pEngineState->userExperience, *pfReloadApp);
810 810
811 return hr; 811 return hr;
812} 812}
diff --git a/src/burn/engine/userexperience.cpp b/src/burn/engine/userexperience.cpp
index 4325a6ee..87ef4de1 100644
--- a/src/burn/engine/userexperience.cpp
+++ b/src/burn/engine/userexperience.cpp
@@ -122,7 +122,6 @@ extern "C" HRESULT UserExperienceLoad(
122 122
123 pUserExperience->pfnBAProc = results.pfnBootstrapperApplicationProc; 123 pUserExperience->pfnBAProc = results.pfnBootstrapperApplicationProc;
124 pUserExperience->pvBAProcContext = results.pvBootstrapperApplicationProcContext; 124 pUserExperience->pvBAProcContext = results.pvBootstrapperApplicationProcContext;
125 pUserExperience->fDisableUnloading = results.fDisableUnloading;
126 125
127LExit: 126LExit:
128 return hr; 127 return hr;
@@ -133,10 +132,18 @@ LExit:
133 132
134*******************************************************************/ 133*******************************************************************/
135extern "C" HRESULT UserExperienceUnload( 134extern "C" HRESULT UserExperienceUnload(
136 __in BURN_USER_EXPERIENCE* pUserExperience 135 __in BURN_USER_EXPERIENCE* pUserExperience,
136 __in BOOL fReload
137 ) 137 )
138{ 138{
139 HRESULT hr = S_OK; 139 HRESULT hr = S_OK;
140 BOOTSTRAPPER_DESTROY_ARGS args = { };
141 BOOTSTRAPPER_DESTROY_RESULTS results = { };
142
143 args.cbSize = sizeof(BOOTSTRAPPER_DESTROY_ARGS);
144 args.fReload = fReload;
145
146 results.cbSize = sizeof(BOOTSTRAPPER_DESTROY_RESULTS);
140 147
141 if (pUserExperience->hUXModule) 148 if (pUserExperience->hUXModule)
142 { 149 {
@@ -144,11 +151,11 @@ extern "C" HRESULT UserExperienceUnload(
144 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = (PFN_BOOTSTRAPPER_APPLICATION_DESTROY)::GetProcAddress(pUserExperience->hUXModule, "BootstrapperApplicationDestroy"); 151 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = (PFN_BOOTSTRAPPER_APPLICATION_DESTROY)::GetProcAddress(pUserExperience->hUXModule, "BootstrapperApplicationDestroy");
145 if (pfnDestroy) 152 if (pfnDestroy)
146 { 153 {
147 pfnDestroy(); 154 pfnDestroy(&args, &results);
148 } 155 }
149 156
150 // Free BA DLL if it supports it. 157 // Free BA DLL if it supports it.
151 if (!pUserExperience->fDisableUnloading && !::FreeLibrary(pUserExperience->hUXModule)) 158 if (!results.fDisableUnloading && !::FreeLibrary(pUserExperience->hUXModule))
152 { 159 {
153 hr = HRESULT_FROM_WIN32(::GetLastError()); 160 hr = HRESULT_FROM_WIN32(::GetLastError());
154 TraceError(hr, "Failed to unload BA DLL."); 161 TraceError(hr, "Failed to unload BA DLL.");
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h
index e7489710..94b73f7d 100644
--- a/src/burn/engine/userexperience.h
+++ b/src/burn/engine/userexperience.h
@@ -22,7 +22,6 @@ typedef struct _BURN_USER_EXPERIENCE
22 HMODULE hUXModule; 22 HMODULE hUXModule;
23 PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBAProc; 23 PFN_BOOTSTRAPPER_APPLICATION_PROC pfnBAProc;
24 LPVOID pvBAProcContext; 24 LPVOID pvBAProcContext;
25 BOOL fDisableUnloading;
26 LPWSTR sczTempDirectory; 25 LPWSTR sczTempDirectory;
27 26
28 CRITICAL_SECTION csEngineActive; // Changing the engine active state in the user experience must be 27 CRITICAL_SECTION csEngineActive; // Changing the engine active state in the user experience must be
@@ -61,7 +60,8 @@ HRESULT UserExperienceLoad(
61 __in BOOTSTRAPPER_COMMAND* pCommand 60 __in BOOTSTRAPPER_COMMAND* pCommand
62 ); 61 );
63HRESULT UserExperienceUnload( 62HRESULT UserExperienceUnload(
64 __in BURN_USER_EXPERIENCE* pUserExperience 63 __in BURN_USER_EXPERIENCE* pUserExperience,
64 __in BOOL fReload
65 ); 65 );
66HRESULT UserExperienceEnsureWorkingFolder( 66HRESULT UserExperienceEnsureWorkingFolder(
67 __in BURN_CACHE* pCache, 67 __in BURN_CACHE* pCache,