Commit e9376fd1 authored by Alex Henrie's avatar Alex Henrie Committed by Alexandre Julliard

wldap32: Handle null DN or null attr in ldap_compare* and add tests.

parent e1930443
...@@ -81,9 +81,10 @@ ULONG CDECL ldap_compare_extA( LDAP *ld, char *dn, char *attr, char *value, stru ...@@ -81,9 +81,10 @@ ULONG CDECL ldap_compare_extA( LDAP *ld, char *dn, char *attr, char *value, stru
data, serverctrls, clientctrls, message ); data, serverctrls, clientctrls, message );
if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
if (!attr) return WLDAP32_LDAP_NO_MEMORY;
if (dn && !(dnW = strAtoW( dn ))) goto exit; 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 (value && !(valueW = strAtoW( value ))) goto exit;
if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit;
if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit; if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) goto exit;
...@@ -116,7 +117,7 @@ ULONG CDECL ldap_compare_extW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, s ...@@ -116,7 +117,7 @@ ULONG CDECL ldap_compare_extW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value, s
if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR; if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
if (!attr) return WLDAP32_LDAP_NO_MEMORY; if (!attr) return WLDAP32_LDAP_NO_MEMORY;
if (dn && !(dnU = strWtoU( dn ))) goto exit; if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit;
if (!(attrU = strWtoU( attr ))) goto exit; if (!(attrU = strWtoU( attr ))) goto exit;
if (!data) if (!data)
{ {
...@@ -161,9 +162,10 @@ ULONG CDECL ldap_compare_ext_sA( LDAP *ld, char *dn, char *attr, char *value, st ...@@ -161,9 +162,10 @@ ULONG CDECL ldap_compare_ext_sA( LDAP *ld, char *dn, char *attr, char *value, st
data, serverctrls, clientctrls ); data, serverctrls, clientctrls );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
if (!attr) return LDAP_UNDEFINED_TYPE;
if (dn && !(dnW = strAtoW( dn ))) goto exit; 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 (value && !(valueW = strAtoW( value ))) goto exit;
if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit; if (serverctrls && !(serverctrlsW = controlarrayAtoW( serverctrls ))) goto exit;
if (clientctrls && !(clientctrlsW = controlarrayAtoW( clientctrls ))) 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, ...@@ -194,9 +196,10 @@ ULONG CDECL ldap_compare_ext_sW( LDAP *ld, WCHAR *dn, WCHAR *attr, WCHAR *value,
serverctrls, clientctrls ); serverctrls, clientctrls );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
if (!attr) return LDAP_UNDEFINED_TYPE;
if (dn && !(dnU = strWtoU( dn ))) goto exit; if (!(dnU = dn ? strWtoU( dn ) : strdup( "" ))) goto exit;
if (attr && !(attrU = strWtoU( attr ))) goto exit; if (!(attrU = strWtoU( attr ))) goto exit;
if (!data) if (!data)
{ {
if (value) if (value)
...@@ -235,9 +238,10 @@ ULONG CDECL ldap_compare_sA( LDAP *ld, PCHAR dn, PCHAR attr, PCHAR 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) ); TRACE( "(%p, %s, %s, %s)\n", ld, debugstr_a(dn), debugstr_a(attr), debugstr_a(value) );
if (!ld) return WLDAP32_LDAP_PARAM_ERROR; if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
if (!attr) return WLDAP32_LDAP_UNDEFINED_TYPE;
if (dn && !(dnW = strAtoW( dn ))) goto exit; 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 (value && !(valueW = strAtoW( value ))) goto exit;
ret = ldap_compare_sW( ld, dnW, attrW, valueW ); ret = ldap_compare_sW( ld, dnW, attrW, valueW );
......
...@@ -295,6 +295,78 @@ static void test_ldap_modify(void) ...@@ -295,6 +295,78 @@ static void test_ldap_modify(void)
ldap_unbind( ld ); 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_NO_MEMORY, "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 ) static void test_ldap_server_control( void )
{ {
/* SEQUENCE { INTEGER :: 0x07 } */ /* SEQUENCE { INTEGER :: 0x07 } */
...@@ -419,6 +491,7 @@ START_TEST (parse) ...@@ -419,6 +491,7 @@ START_TEST (parse)
test_ldap_bind_sA(); test_ldap_bind_sA();
test_ldap_add(); test_ldap_add();
test_ldap_modify(); test_ldap_modify();
test_ldap_compare();
ld = ldap_initA( (char *)"db.debian.org", 389 ); ld = ldap_initA( (char *)"db.debian.org", 389 );
ok( ld != NULL, "ldap_init failed\n" ); ok( ld != NULL, "ldap_init failed\n" );
......
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