Commit 8bfc0877 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Don't keep handles open to the patch database in MSI_ApplyPatchW.

parent a4d25f12
...@@ -299,49 +299,66 @@ done: ...@@ -299,49 +299,66 @@ done:
return r; return r;
} }
static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWSTR szCommandLine) static UINT get_patch_product_codes( LPCWSTR szPatchPackage, WCHAR **product_codes )
{ {
MSIHANDLE patch = 0, info = 0; MSIHANDLE patch, info = 0;
UINT r = ERROR_SUCCESS, type; UINT r, type;
DWORD size = 0; DWORD size;
LPCWSTR cmd_ptr = szCommandLine;
LPWSTR beg, end, cmd = NULL, codes = NULL;
BOOL succeeded = FALSE;
static const WCHAR patcheq[] = {'P','A','T','C','H','=',0};
static WCHAR empty[] = {0}; static WCHAR empty[] = {0};
WCHAR *codes;
if (!szPatchPackage || !szPatchPackage[0]) r = MsiOpenDatabaseW( szPatchPackage, MSIDBOPEN_READONLY, &patch );
return ERROR_INVALID_PARAMETER;
if (!szProductCode)
{
r = MsiOpenDatabaseW(szPatchPackage, MSIDBOPEN_READONLY, &patch);
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
return r; return r;
r = MsiGetSummaryInformationW(patch, NULL, 0, &info); r = MsiGetSummaryInformationW( patch, NULL, 0, &info );
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
goto done; goto done;
r = MsiSummaryInfoGetPropertyW(info, PID_TEMPLATE, &type, NULL, NULL, empty, &size); size = 0;
r = MsiSummaryInfoGetPropertyW( info, PID_TEMPLATE, &type, NULL, NULL, empty, &size );
if (r != ERROR_MORE_DATA || !size || type != VT_LPSTR) if (r != ERROR_MORE_DATA || !size || type != VT_LPSTR)
{ {
ERR("Failed to read product codes from patch\n"); ERR("Failed to read product codes from patch\n");
r = ERROR_FUNCTION_FAILED;
goto done; goto done;
} }
codes = msi_alloc(++size * sizeof(WCHAR)); codes = msi_alloc( ++size * sizeof(WCHAR) );
if (!codes) if (!codes)
{ {
r = ERROR_OUTOFMEMORY; r = ERROR_OUTOFMEMORY;
goto done; goto done;
} }
r = MsiSummaryInfoGetPropertyW(info, PID_TEMPLATE, &type, NULL, NULL, codes, &size); r = MsiSummaryInfoGetPropertyW( info, PID_TEMPLATE, &type, NULL, NULL, codes, &size );
if (r != ERROR_SUCCESS) if (r != ERROR_SUCCESS)
goto done; msi_free( codes );
} else
*product_codes = codes;
done:
MsiCloseHandle( info );
MsiCloseHandle( patch );
return r;
}
static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWSTR szCommandLine)
{
UINT r;
DWORD size;
LPCWSTR cmd_ptr = szCommandLine;
LPWSTR beg, end, cmd, codes = NULL;
BOOL succeeded = FALSE;
static const WCHAR patcheq[] = {'P','A','T','C','H','=',0};
static WCHAR empty[] = {0};
if (!szPatchPackage || !szPatchPackage[0])
return ERROR_INVALID_PARAMETER;
if (!szProductCode && (r = get_patch_product_codes( szPatchPackage, &codes )))
return r;
if (!szCommandLine) if (!szCommandLine)
cmd_ptr = empty; cmd_ptr = empty;
...@@ -350,8 +367,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS ...@@ -350,8 +367,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
cmd = msi_alloc(size * sizeof(WCHAR)); cmd = msi_alloc(size * sizeof(WCHAR));
if (!cmd) if (!cmd)
{ {
r = ERROR_OUTOFMEMORY; msi_free(codes);
goto done; return ERROR_OUTOFMEMORY;
} }
lstrcpyW(cmd, cmd_ptr); lstrcpyW(cmd, cmd_ptr);
...@@ -380,13 +397,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS ...@@ -380,13 +397,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
r = ERROR_SUCCESS; r = ERROR_SUCCESS;
} }
done:
msi_free(cmd); msi_free(cmd);
msi_free(codes); msi_free(codes);
MsiCloseHandle(info);
MsiCloseHandle(patch);
return r; return r;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment