Commit 145b4109 authored by Mark Jansen's avatar Mark Jansen Committed by Alexandre Julliard

msi: Prevent uninitialized variable usage.

Observed with Lync 2010 setup in ReactOS. The embedded Silverlight setup hits this case (no LASTUSEDSOURCE in the registry). Signed-off-by: 's avatarMark Jansen <mark.jansen@reactos.org> Signed-off-by: 's avatarHans Leidekker <hans@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent c91f254a
...@@ -592,8 +592,11 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid, ...@@ -592,8 +592,11 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
0, 0, NULL, &size); 0, 0, NULL, &size);
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
{ {
RegCloseKey(sourcekey); static WCHAR szEmpty[1] = { '\0' };
return ERROR_SUCCESS; rc = ERROR_SUCCESS;
source = NULL;
ptr = szEmpty;
goto output_out;
} }
source = msi_alloc(size); source = msi_alloc(size);
...@@ -627,7 +630,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid, ...@@ -627,7 +630,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
else else
ptr++; ptr++;
} }
output_out:
if (szValue) if (szValue)
{ {
if (strlenW(ptr) < *pcchValue) if (strlenW(ptr) < *pcchValue)
......
...@@ -48,6 +48,8 @@ static UINT (WINAPI *pMsiSourceListEnumSourcesA) ...@@ -48,6 +48,8 @@ static UINT (WINAPI *pMsiSourceListEnumSourcesA)
(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD); (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD);
static UINT (WINAPI *pMsiSourceListGetInfoA) static UINT (WINAPI *pMsiSourceListGetInfoA)
(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD); (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD);
static UINT (WINAPI *pMsiSourceListGetInfoW)
(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, LPCWSTR, LPWSTR, LPDWORD);
static UINT (WINAPI *pMsiSourceListSetInfoA) static UINT (WINAPI *pMsiSourceListSetInfoA)
(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD,LPCSTR, LPCSTR); (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD,LPCSTR, LPCSTR);
static UINT (WINAPI *pMsiSourceListAddSourceA) static UINT (WINAPI *pMsiSourceListAddSourceA)
...@@ -69,6 +71,7 @@ static void init_functionpointers(void) ...@@ -69,6 +71,7 @@ static void init_functionpointers(void)
GET_PROC(hmsi, MsiSourceListEnumMediaDisksA) GET_PROC(hmsi, MsiSourceListEnumMediaDisksA)
GET_PROC(hmsi, MsiSourceListEnumSourcesA) GET_PROC(hmsi, MsiSourceListEnumSourcesA)
GET_PROC(hmsi, MsiSourceListGetInfoA) GET_PROC(hmsi, MsiSourceListGetInfoA)
GET_PROC(hmsi, MsiSourceListGetInfoW)
GET_PROC(hmsi, MsiSourceListSetInfoA) GET_PROC(hmsi, MsiSourceListSetInfoA)
GET_PROC(hmsi, MsiSourceListAddSourceA) GET_PROC(hmsi, MsiSourceListAddSourceA)
...@@ -179,14 +182,21 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase ...@@ -179,14 +182,21 @@ static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase
#define CHECK_REG_STR(prodkey, name, expected) \ #define CHECK_REG_STR(prodkey, name, expected) \
check_reg_str(prodkey, name, expected, TRUE, __LINE__); check_reg_str(prodkey, name, expected, TRUE, __LINE__);
static inline WCHAR *strdupAW( const char *str )
{
int len;
WCHAR *ret;
len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL;
MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
return ret;
}
static void test_MsiSourceListGetInfo(void) static void test_MsiSourceListGetInfo(void)
{ {
CHAR prodcode[MAX_PATH]; char prodcode[MAX_PATH], prod_squashed[MAX_PATH], keypath[MAX_PATH * 2], value[MAX_PATH], *usersid;
CHAR prod_squashed[MAX_PATH]; WCHAR valueW[MAX_PATH], *usersidW, *prodcodeW;
CHAR keypath[MAX_PATH*2]; const char *data;
CHAR value[MAX_PATH];
LPSTR usersid;
LPCSTR data;
LONG res; LONG res;
UINT r; UINT r;
HKEY userkey, hkey, media; HKEY userkey, hkey, media;
...@@ -416,6 +426,30 @@ static void test_MsiSourceListGetInfo(void) ...@@ -416,6 +426,30 @@ static void test_MsiSourceListGetInfo(void)
ok(!lstrcmpA(value, "prompt"), "Expected \"prompt\", got \"%s\"\n", value); ok(!lstrcmpA(value, "prompt"), "Expected \"prompt\", got \"%s\"\n", value);
ok(size == 6, "Expected 6, got %d\n", size); ok(size == 6, "Expected 6, got %d\n", size);
/* LastUsedSource value doesn't exist */
RegDeleteValueA(hkey, "LastUsedSource");
size = MAX_PATH;
memset(value, 0x55, sizeof(value));
r = pMsiSourceListGetInfoA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEA,
value, &size);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value);
ok(size == 0, "Expected 0, got %d\n", size);
size = MAX_PATH;
usersidW = strdupAW(usersid);
prodcodeW = strdupAW(prodcode);
memset(valueW, 0x55, sizeof(valueW));
r = pMsiSourceListGetInfoW(prodcodeW, usersidW, MSIINSTALLCONTEXT_USERUNMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW,
valueW, &size);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
ok(!valueW[0], "Expected \"\"");
ok(size == 0, "Expected 0, got %d\n", size);
HeapFree(GetProcessHeap(), 0, usersidW);
HeapFree(GetProcessHeap(), 0, prodcodeW);
data = ""; data = "";
res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ, res = RegSetValueExA(hkey, "LastUsedSource", 0, REG_SZ,
(const BYTE *)data, lstrlenA(data) + 1); (const BYTE *)data, lstrlenA(data) + 1);
......
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