Add error handling to RenamePrgFolder and RemovePrgFolder

These routines can fail during MSI installation
(seen leftover program_old folders, with program folder missing).

We at least want to see the error in the MSI log file when this doesn't succeed.

This outputs error messages like:

  MSI (s) (C4:5C) [10:47:54:280]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI37B4.tmp, Entrypoint: RemovePrgFolder
  CustomAction RemovePrgFolder returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
  Action ended 10:47:54: RemovePrgFolder. Return value 3.

Change-Id: I4ce4099eeb3e0ee79eb4a2e1d3887f9810fd9669
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134160
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
This commit is contained in:
Samuel Mehrbrodt
2022-05-11 14:18:44 +02:00
parent 1e01692076
commit 86453991a7
@@ -80,6 +80,12 @@ static bool RemoveCompleteDirectoryW(const std::wstring& rPath)
return bDirectoryRemoved;
}
/** Move program folder to program_old. Tries 10 times (program_old1, program_old2, ...).
*
* @return
* ERROR_INSTALL_FAILURE when the folder cannot be moved.
* ERROR_SUCCESS otherwise.
*/
extern "C" __declspec(dllexport) UINT __stdcall RenamePrgFolder( MSIHANDLE handle )
{
std::wstring sOfficeInstallPath = GetMsiPropertyW(handle, L"INSTALLLOCATION");
@@ -101,22 +107,30 @@ extern "C" __declspec(dllexport) UINT __stdcall RenamePrgFolder( MSIHANDLE handl
}
}
// ? This succeeds unconditionally, even if bSuccess is false!
return ERROR_SUCCESS;
return bSuccess ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
}
/** Remove leftover program_old folder(s).
*
* @return
* ERROR_INSTALL_FAILURE when the folder cannot be removed.
* ERROR_SUCCESS otherwise.
*/
extern "C" __declspec(dllexport) UINT __stdcall RemovePrgFolder( MSIHANDLE handle )
{
std::wstring sOfficeInstallPath = GetMsiPropertyW(handle, L"INSTALLLOCATION");
std::wstring sRemoveDir = sOfficeInstallPath + L"program_old";
RemoveCompleteDirectoryW( sRemoveDir );
if (!RemoveCompleteDirectoryW(sRemoveDir))
return ERROR_INSTALL_FAILURE;
WCHAR sAppend[2] = L"0";
for ( int i = 0; i < 10; i++ )
{
sRemoveDir = sOfficeInstallPath + L"program_old" + sAppend;
RemoveCompleteDirectoryW( sRemoveDir );
if (!RemoveCompleteDirectoryW( sRemoveDir ))
return ERROR_INSTALL_FAILURE;
sAppend[0] += 1;
}