From: Alex Henrie alexhenrie24@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54702 --- dlls/wldap32/compare.c | 18 ++++++---- dlls/wldap32/tests/parse.c | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 7 deletions(-)
diff --git a/dlls/wldap32/compare.c b/dlls/wldap32/compare.c index d23e52ef207..ee1983c714e 100644 --- a/dlls/wldap32/compare.c +++ b/dlls/wldap32/compare.c @@ -81,9 +81,10 @@ ULONG CDECL ldap_compare_extA( LDAP *ld, char *dn, char *attr, char *value, stru data, serverctrls, clientctrls, message );
if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return WLDAP32_LDAP_UNDEFINED_TYPE;
if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit; @@ -114,9 +115,9 @@ ULONG CDECL ldap_compare_extW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, s data, serverctrls, clientctrls, message );
if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; - if (!attr) return WLDAP32_LDAP_NO_MEMORY; + if (!attr) return WLDAP32_LDAP_UNDEFINED_TYPE;
- if (dn && !(dnU = strWtoU( dn ))) goto exit; + if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit; if (!(attrU = strWtoU( attr ))) goto exit; if (!data) { @@ -161,9 +162,10 @@ ULONG CDECL ldap_compare_ext_sA( LDAP *ld, char *dn, char *attr, char *value, st data, serverctrls, clientctrls );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return LDAP_UNDEFINED_TYPE;
if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit; @@ -194,9 +196,10 @@ ULONG CDECL ldap_compare_ext_sW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, serverctrls, clientctrls );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return LDAP_UNDEFINED_TYPE;
- if (dn && !(dnU = strWtoU( dn ))) goto exit; - if (attr && !(attrU = strWtoU( attr ))) goto exit; + if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit; + if (!(attrU = strWtoU( attr ))) goto exit; if (!data) { if (value) @@ -235,9 +238,10 @@ ULONG CDECL ldap_compare_sA( LDAP *ld, PCHAR dn, PCHAR attr, PCHAR value ) TRACE( "(%p, %s, %s, %s)\n", ld, debugstr_a(dn), debugstr_a(attr), debugstr_a(value) );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; + if (!attr) return WLDAP32_LDAP_UNDEFINED_TYPE;
if (dn && !(dnW = strAtoW( dn ))) goto exit; - if (attr && !(attrW = strAtoW( attr ))) goto exit; + if (!(attrW = strAtoW( attr ))) goto exit; if (value && !(valueW = strAtoW( value ))) goto exit;
ret = ldap_compare_sW( ld, dnW, attrW, valueW ); diff --git a/dlls/wldap32/tests/parse.c b/dlls/wldap32/tests/parse.c index 1653b0ef72c..ce4062f3156 100644 --- a/dlls/wldap32/tests/parse.c +++ b/dlls/wldap32/tests/parse.c @@ -295,6 +295,78 @@ static void test_ldap_modify(void) ldap_unbind( ld ); }
+static void test_ldap_compare(void) +{ + struct berval empty_value = { 0 }; + LDAP *ld; + ULONG ret, num; + + ld = ldap_initA( (char *)"db.debian.org", 389 ); + ok( ld != NULL, "ldap_init failed\n" ); + + ret = ldap_compareA( NULL, NULL, NULL, NULL ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( NULL, (char *)"", (char *)"", (char *)"" ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( ld, NULL, (char *)"", (char *)"" ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", NULL, (char *)"" ); + ok( ret == (ULONG)-1, "ldap_compareA should fail, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", (char *)"", NULL ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + ret = ldap_compareA( ld, (char *)"", (char *)"", (char *)"" ); + ok( ret != (ULONG)-1, "ldap_compareA should succeed, got %#lx\n", ret ); + + ret = ldap_compare_sA( NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( NULL, (char *)"", (char *)"", (char *)"" ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, NULL, (char *)"", (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", NULL, (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", (char *)"", NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_sA( ld, (char *)"", (char *)"", (char *)"" ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_sA should fail, got %#lx\n", ret ); + + ret = ldap_compare_extA( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( NULL, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, NULL, (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", NULL, (char *)"", &empty_value, NULL, NULL, &num ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", NULL, &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", NULL, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_extA should fail, got %#lx\n", ret ); + ret = ldap_compare_extA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL, &num ); + ok( !ret, "ldap_compare_extA should succeed, got %#lx\n", ret ); + + ret = ldap_compare_ext_sA( NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( NULL, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_PARAM_ERROR, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, NULL, (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", NULL, (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", NULL, &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", (char *)"", NULL, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + ret = ldap_compare_ext_sA( ld, (char *)"", (char *)"", (char *)"", &empty_value, NULL, NULL ); + ok( ret == LDAP_UNDEFINED_TYPE, "ldap_compare_ext_sA should fail, got %#lx\n", ret ); + + ldap_unbind( ld ); +} + static void test_ldap_server_control( void ) { /* SEQUENCE { INTEGER :: 0x07 } */ @@ -419,6 +491,7 @@ START_TEST (parse) test_ldap_bind_sA(); test_ldap_add(); test_ldap_modify(); + test_ldap_compare();
ld = ldap_initA( (char *)"db.debian.org", 389 ); ok( ld != NULL, "ldap_init failed\n" );
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=130913
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w7u_adm (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w7u_el (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w8 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w8adm (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w864 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064v1507 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064v1809 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064_tsign (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w11pro64 (32 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w7pro64 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w864 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064v1507 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064v1809 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064_2qxl (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064_adm (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w1064_tsign (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64_en_AE_u8 (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64_ar (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64_ja (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w10pro64_zh_CN (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a
=== w11pro64_amd (64 bit report) ===
wldap32: parse.c:340: Test failed: ldap_compare_extA should fail, got 0x5a