wine/dlls/msi tests/db.c registry.c
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Nov 9 04:59:20 CST 2005
ChangeSet ID: 21192
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/09 04:59:20
Modified files:
dlls/msi/tests : db.c
dlls/msi : registry.c
Log message:
Mike McCormack <mike at codeweavers.com>
Fix passing of NULL pointers to MsiDecomposeDescriptor and add a
test.
Patch: http://cvs.winehq.org/patch.py?id=21192
Old revision New revision Changes Path
1.17 1.18 +26 -6 wine/dlls/msi/tests/db.c
1.12 1.13 +27 -15 wine/dlls/msi/registry.c
Index: wine/dlls/msi/tests/db.c
diff -u -p wine/dlls/msi/tests/db.c:1.17 wine/dlls/msi/tests/db.c:1.18
--- wine/dlls/msi/tests/db.c:1.17 9 Nov 2005 10:59:20 -0000
+++ wine/dlls/msi/tests/db.c 9 Nov 2005 10:59:20 -0000
@@ -128,7 +128,7 @@ static void test_msiinsert(void)
}
typedef UINT (WINAPI *fnMsiDecomposeDescriptorA)(LPCSTR, LPCSTR, LPSTR, LPSTR, DWORD *);
-fnMsiDecomposeDescriptorA MsiDecomposeDescriptorA;
+static fnMsiDecomposeDescriptorA pMsiDecomposeDescriptorA;
static void test_msidecomposedesc(void)
{
@@ -141,15 +141,15 @@ static void test_msidecomposedesc(void)
hmod = GetModuleHandle("msi.dll");
if (!hmod)
return;
- MsiDecomposeDescriptorA = (fnMsiDecomposeDescriptorA)
+ pMsiDecomposeDescriptorA = (fnMsiDecomposeDescriptorA)
GetProcAddress(hmod, "MsiDecomposeDescriptorA");
- if (!MsiDecomposeDescriptorA)
+ if (!pMsiDecomposeDescriptorA)
return;
/* test a valid feature descriptor */
desc = "']gAVn-}f(ZXfeAR6.jiFollowTheWhiteRabbit>3w2x^IGfe?CxI5heAvk.";
len = 0;
- r = MsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
+ r = pMsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
ok(r == ERROR_SUCCESS, "returned an error\n");
ok(len == strlen(desc), "length was wrong\n");
ok(strcmp(prod,"{90110409-6000-11D3-8CFE-0150048383C9}")==0, "product wrong\n");
@@ -161,7 +161,7 @@ static void test_msidecomposedesc(void)
"ThisWillFailIfTheresMoreThanAGuidsChars>"
"3w2x^IGfe?CxI5heAvk.";
len = 0;
- r = MsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
+ r = pMsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
ok(r == ERROR_INVALID_PARAMETER, "returned wrong error\n");
/*
@@ -173,9 +173,29 @@ static void test_msidecomposedesc(void)
"3w2x^IGfe?CxI5heAvk."
"extra";
len = 0;
- r = MsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
+ r = pMsiDecomposeDescriptorA(desc, prod, feature, comp, &len);
ok(r == ERROR_SUCCESS, "returned wrong error\n");
ok(len == (strlen(desc) - strlen("extra")), "length wrong\n");
+
+ len = 0;
+ r = pMsiDecomposeDescriptorA(desc, prod, feature, NULL, &len);
+ ok(r == ERROR_SUCCESS, "returned wrong error\n");
+ ok(len == (strlen(desc) - strlen("extra")), "length wrong\n");
+
+ len = 0;
+ r = pMsiDecomposeDescriptorA(desc, prod, NULL, NULL, &len);
+ ok(r == ERROR_SUCCESS, "returned wrong error\n");
+ ok(len == (strlen(desc) - strlen("extra")), "length wrong\n");
+
+ len = 0;
+ r = pMsiDecomposeDescriptorA(desc, NULL, NULL, NULL, &len);
+ ok(r == ERROR_SUCCESS, "returned wrong error\n");
+ ok(len == (strlen(desc) - strlen("extra")), "length wrong\n");
+
+ len = 0;
+ r = pMsiDecomposeDescriptorA(NULL, NULL, NULL, NULL, &len);
+ ok(r == ERROR_INVALID_PARAMETER, "returned wrong error\n");
+ ok(len == 0, "length wrong\n");
}
static UINT try_query_param( MSIHANDLE hdb, LPCSTR szQuery, MSIHANDLE hrec )
Index: wine/dlls/msi/registry.c
diff -u -p wine/dlls/msi/registry.c:1.12 wine/dlls/msi/registry.c:1.13
--- wine/dlls/msi/registry.c:1.12 9 Nov 2005 10:59:20 -0000
+++ wine/dlls/msi/registry.c 9 Nov 2005 10:59:20 -0000
@@ -253,6 +253,9 @@ BOOL decode_base85_guid( LPCWSTR str, GU
{
DWORD i, val = 0, base = 1, *p;
+ if (!str)
+ return FALSE;
+
p = (DWORD*) guid;
for( i=0; i<20; i++ )
{
@@ -532,8 +535,11 @@ UINT WINAPI MsiDecomposeDescriptorW( LPC
len = (p - &szDescriptor[20]);
if( len > MAX_FEATURE_CHARS )
return ERROR_INVALID_PARAMETER;
- memcpy( szFeature, &szDescriptor[20], len*sizeof(WCHAR) );
- szFeature[len] = 0;
+ if (szFeature)
+ {
+ memcpy( szFeature, &szDescriptor[20], len*sizeof(WCHAR) );
+ szFeature[len] = 0;
+ }
TRACE("feature %s\n", debugstr_w( szFeature ));
@@ -543,8 +549,10 @@ UINT WINAPI MsiDecomposeDescriptorW( LPC
TRACE("component %s\n", debugstr_guid( &component ));
- StringFromGUID2( &product, szProduct, MAX_FEATURE_CHARS+1 );
- StringFromGUID2( &component, szComponent, MAX_FEATURE_CHARS+1 );
+ if (szProduct)
+ StringFromGUID2( &product, szProduct, MAX_FEATURE_CHARS+1 );
+ if (szComponent)
+ StringFromGUID2( &component, szComponent, MAX_FEATURE_CHARS+1 );
len = ( &p[21] - szDescriptor );
TRACE("length = %d\n", len);
@@ -559,26 +567,30 @@ UINT WINAPI MsiDecomposeDescriptorA( LPC
WCHAR product[MAX_FEATURE_CHARS+1];
WCHAR feature[MAX_FEATURE_CHARS+1];
WCHAR component[MAX_FEATURE_CHARS+1];
- LPWSTR str = NULL;
+ LPWSTR str = NULL, p = NULL, f = NULL, c = NULL;
UINT r;
TRACE("%s %p %p %p %p\n", debugstr_a(szDescriptor), szProduct,
szFeature, szComponent, pUsed);
- if( szDescriptor )
- {
- str = strdupAtoW( szDescriptor );
- if( !str )
- return ERROR_OUTOFMEMORY;
- }
+ str = strdupAtoW( szDescriptor );
+ if( szDescriptor && !str )
+ return ERROR_OUTOFMEMORY;
+
+ if (szProduct)
+ p = product;
+ if (szFeature)
+ f = feature;
+ if (szComponent)
+ c = component;
- r = MsiDecomposeDescriptorW( str, product, feature, component, pUsed );
+ r = MsiDecomposeDescriptorW( str, p, f, c, pUsed );
- WideCharToMultiByte( CP_ACP, 0, product, MAX_FEATURE_CHARS+1,
+ WideCharToMultiByte( CP_ACP, 0, p, MAX_FEATURE_CHARS+1,
szProduct, MAX_FEATURE_CHARS+1, NULL, NULL );
- WideCharToMultiByte( CP_ACP, 0, feature, MAX_FEATURE_CHARS+1,
+ WideCharToMultiByte( CP_ACP, 0, f, MAX_FEATURE_CHARS+1,
szFeature, MAX_FEATURE_CHARS+1, NULL, NULL );
- WideCharToMultiByte( CP_ACP, 0, component, MAX_FEATURE_CHARS+1,
+ WideCharToMultiByte( CP_ACP, 0, c, MAX_FEATURE_CHARS+1,
szComponent, MAX_FEATURE_CHARS+1, NULL, NULL );
msi_free( str );
More information about the wine-cvs
mailing list