Hans Leidekker : msi: Dynamically allocate the path buffer in MsiQueryComponentStateW.
Alexandre Julliard
julliard at winehq.org
Mon Apr 23 13:41:38 CDT 2012
Module: wine
Branch: master
Commit: 2e5bf9ca066c8c042ac0be5ef12497245b4a0c11
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e5bf9ca066c8c042ac0be5ef12497245b4a0c11
Author: Hans Leidekker <hans at codeweavers.com>
Date: Mon Apr 23 15:46:41 2012 +0200
msi: Dynamically allocate the path buffer in MsiQueryComponentStateW.
---
dlls/msi/msi.c | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 35ffe9e..baef974 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -2148,7 +2148,7 @@ static BOOL msi_comp_find_package(LPCWSTR prodcode, MSIINSTALLCONTEXT context)
return (res == ERROR_SUCCESS);
}
-static BOOL msi_comp_find_prodcode(LPWSTR squished_pc,
+static UINT msi_comp_find_prodcode(LPWSTR squished_pc,
MSIINSTALLCONTEXT context,
LPCWSTR comp, LPWSTR val, DWORD *sz)
{
@@ -2162,14 +2162,14 @@ static BOOL msi_comp_find_prodcode(LPWSTR squished_pc,
r = MSIREG_OpenUserDataComponentKey(comp, NULL, &hkey, FALSE);
if (r != ERROR_SUCCESS)
- return FALSE;
+ return r;
res = RegQueryValueExW(hkey, squished_pc, NULL, NULL, (BYTE *)val, sz);
if (res != ERROR_SUCCESS)
- return FALSE;
+ return res;
RegCloseKey(hkey);
- return TRUE;
+ return res;
}
UINT WINAPI MsiQueryComponentStateW(LPCWSTR szProductCode,
@@ -2177,7 +2177,6 @@ UINT WINAPI MsiQueryComponentStateW(LPCWSTR szProductCode,
LPCWSTR szComponent, INSTALLSTATE *pdwState)
{
WCHAR squished_pc[GUID_SIZE];
- WCHAR val[MAX_PATH];
BOOL found;
DWORD sz;
@@ -2208,14 +2207,21 @@ UINT WINAPI MsiQueryComponentStateW(LPCWSTR szProductCode,
*pdwState = INSTALLSTATE_UNKNOWN;
- sz = MAX_PATH;
- if (!msi_comp_find_prodcode(squished_pc, dwContext, szComponent, val, &sz))
+ sz = 0;
+ if (msi_comp_find_prodcode(squished_pc, dwContext, szComponent, NULL, &sz))
return ERROR_UNKNOWN_COMPONENT;
if (sz == 0)
*pdwState = INSTALLSTATE_NOTUSED;
else
{
+ WCHAR *val;
+ UINT r;
+
+ if (!(val = msi_alloc( sz ))) return ERROR_OUTOFMEMORY;
+ if ((r = msi_comp_find_prodcode(squished_pc, dwContext, szComponent, val, &sz)))
+ return r;
+
if (lstrlenW(val) > 2 &&
val[0] >= '0' && val[0] <= '9' && val[1] >= '0' && val[1] <= '9' && val[2] != ':')
{
@@ -2223,6 +2229,7 @@ UINT WINAPI MsiQueryComponentStateW(LPCWSTR szProductCode,
}
else
*pdwState = INSTALLSTATE_LOCAL;
+ msi_free( val );
}
TRACE("-> %d\n", *pdwState);
More information about the wine-cvs
mailing list