diff --git a/dlls/wldap32/delete.c b/dlls/wldap32/delete.c index 77b9e8249bb..abeefbb77c3 100644 --- a/dlls/wldap32/delete.c +++ b/dlls/wldap32/delete.c @@ -67,6 +67,7 @@ ULONG ldap_deleteW( WLDAP32_LDAP *ld, PWCHAR dn ) ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL; + int msg; TRACE( "(%p, %s)\n", ld, debugstr_w(dn) ); @@ -77,7 +78,13 @@ ULONG ldap_deleteW( WLDAP32_LDAP *ld, PWCHAR dn ) if (!dnU) return WLDAP32_LDAP_NO_MEMORY; } - ret = ldap_delete( ld, dn ? dnU : "" ); + ret = ldap_delete_ext( ld, dn ? dnU : "", NULL, NULL, &msg ); + + if (ret == LDAP_SUCCESS) + ret = msg; + else + ret = ~0UL; + strfreeU( dnU ); #endif @@ -275,7 +282,7 @@ ULONG ldap_delete_sW( WLDAP32_LDAP *ld, PWCHAR dn ) if (!dnU) return WLDAP32_LDAP_NO_MEMORY; } - ret = ldap_delete_s( ld, dn ? dnU : "" ); + ret = ldap_delete_ext_s( ld, dn ? dnU : "", NULL, NULL ); strfreeU( dnU ); #endif diff --git a/dlls/wldap32/dn.c b/dlls/wldap32/dn.c index e54946af22c..5be63e7d264 100644 --- a/dlls/wldap32/dn.c +++ b/dlls/wldap32/dn.c @@ -118,7 +118,7 @@ PWCHAR *ldap_explode_dnW( PWCHAR dn, ULONG notypes ) ret = strarrayUtoW( retU ); strfreeU( dnU ); - ldap_value_free( retU ); + ldap_memvfree( (void **)retU ); #endif return ret; diff --git a/dlls/wldap32/error.c b/dlls/wldap32/error.c index 7efc2068594..240c6eade25 100644 --- a/dlls/wldap32/error.c +++ b/dlls/wldap32/error.c @@ -84,11 +84,18 @@ ULONG WLDAP32_ldap_result2error( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *res, ULO { ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP + int error; TRACE( "(%p, %p, 0x%08lx)\n", ld, res, free ); - if (!ld) return ~0UL; - ret = ldap_result2error( ld, res, free ); + if (!ld || !res) return ~0UL; + + ret = ldap_parse_result( ld, res, &error, NULL, NULL, NULL, NULL, free ); + + if (ret == LDAP_SUCCESS) + ret = error; + else + ret = ~0UL; #endif return ret; diff --git a/dlls/wldap32/misc.c b/dlls/wldap32/misc.c index f69832a51d5..2e54c0932e2 100644 --- a/dlls/wldap32/misc.c +++ b/dlls/wldap32/misc.c @@ -50,7 +50,7 @@ ULONG WLDAP32_ldap_abandon( WLDAP32_LDAP *ld, ULONG msgid ) TRACE( "(%p, 0x%08lx)\n", ld, msgid ); if (!ld) return ~0UL; - ret = ldap_abandon( ld, msgid ); + ret = ldap_abandon_ext( ld, msgid, NULL, NULL ); #endif return ret; @@ -81,7 +81,7 @@ ULONG ldap_check_filterW( WLDAP32_LDAP *ld, PWCHAR filter ) TRACE( "(%p, %s)\n", ld, debugstr_w(filter) ); if (!ld) return WLDAP32_LDAP_PARAM_ERROR; - return LDAP_SUCCESS; + return LDAP_SUCCESS; /* FIXME: do some checks */ } ULONG ldap_cleanup( HANDLE instance ) @@ -357,7 +357,7 @@ ULONG WLDAP32_ldap_result( WLDAP32_LDAP *ld, ULONG msgid, ULONG all, TRACE( "(%p, 0x%08lx, 0x%08lx, %p, %p)\n", ld, msgid, all, timeout, res ); - if (!ld || !res) return ~0UL; + if (!ld || !res || msgid == ~0UL) return ~0UL; ret = ldap_result( ld, msgid, all, (struct timeval *)timeout, res ); #endif diff --git a/dlls/wldap32/modify.c b/dlls/wldap32/modify.c index 2747a5af1ca..55ac77605a6 100644 --- a/dlls/wldap32/modify.c +++ b/dlls/wldap32/modify.c @@ -79,6 +79,7 @@ ULONG ldap_modifyW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) #ifdef HAVE_LDAP char *dnU = NULL; LDAPMod **modsU = NULL; + int msg; ret = WLDAP32_LDAP_NO_MEMORY; @@ -95,7 +96,13 @@ ULONG ldap_modifyW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) if (!modsU) goto exit; } - ret = ldap_modify( ld, dn ? dnU : "", mods ? modsU : nullmods ); + ret = ldap_modify_ext( ld, dn ? dnU : "", mods ? modsU : nullmods, + NULL, NULL, &msg ); + + if (ret == LDAP_SUCCESS) + ret = msg; + else + ret = ~0UL; exit: strfreeU( dnU ); @@ -342,7 +349,7 @@ ULONG ldap_modify_sW( WLDAP32_LDAP *ld, PWCHAR dn, LDAPModW *mods[] ) if (!modsU) goto exit; } - ret = ldap_modify_s( ld, dn ? dnU : "", mods ? modsU : nullmods ); + ret = ldap_modify_ext_s( ld, dn ? dnU : "", mods ? modsU : nullmods, NULL, NULL ); exit: strfreeU( dnU ); diff --git a/dlls/wldap32/modrdn.c b/dlls/wldap32/modrdn.c index 17ab03b99ae..a572fe75046 100644 --- a/dlls/wldap32/modrdn.c +++ b/dlls/wldap32/modrdn.c @@ -75,6 +75,7 @@ ULONG ldap_modrdnW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn ) ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *newdnU = NULL; + int msg; ret = WLDAP32_LDAP_NO_MEMORY; @@ -90,7 +91,12 @@ ULONG ldap_modrdnW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn ) newdnU = strWtoU( newdn ); if (!newdnU) goto exit; - ret = ldap_modrdn( ld, dn ? dnU : "", newdnU ); + ret = ldap_rename( ld, dn ? dnU : "", newdnU, NULL, 1, NULL, NULL, &msg ); + + if (ret == LDAP_SUCCESS) + ret = msg; + else + ret = ~0UL; exit: strfreeU( dnU ); @@ -135,6 +141,7 @@ ULONG ldap_modrdn2W( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn, INT delete ) ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *dnU = NULL, *newdnU = NULL; + int msg; ret = WLDAP32_LDAP_NO_MEMORY; @@ -150,7 +157,12 @@ ULONG ldap_modrdn2W( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn, INT delete ) newdnU = strWtoU( newdn ); if (!newdnU) goto exit; - ret = ldap_modrdn2( ld, dn ? dnU : "", newdnU, delete ); + ret = ldap_rename( ld, dn ? dnU : "", newdnU, NULL, delete, NULL, NULL, &msg ); + + if (ret == LDAP_SUCCESS) + ret = msg; + else + ret = ~0UL; exit: strfreeU( dnU ); @@ -210,7 +222,7 @@ ULONG ldap_modrdn2_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn, INT delete ) newdnU = strWtoU( newdn ); if (!newdnU) goto exit; - ret = ldap_modrdn2_s( ld, dn ? dnU : "", newdnU, delete ); + ret = ldap_rename_s( ld, dn ? dnU : "", newdnU, NULL, delete, NULL, NULL ); exit: strfreeU( dnU ); @@ -270,7 +282,7 @@ ULONG ldap_modrdn_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newdn ) newdnU = strWtoU( newdn ); if (!newdnU) goto exit; - ret = ldap_modrdn_s( ld, dn ? dnU : "", newdnU ); + ret = ldap_rename_s( ld, dn ? dnU : "", newdnU, NULL, 1, NULL, NULL ); exit: strfreeU( dnU ); diff --git a/dlls/wldap32/option.c b/dlls/wldap32/option.c index 288f96af124..861d9f5dfa1 100644 --- a/dlls/wldap32/option.c +++ b/dlls/wldap32/option.c @@ -217,13 +217,13 @@ ULONG ldap_get_optionW( WLDAP32_LDAP *ld, int option, void *value ) infoW->ldapai_vendor_name = strUtoW( infoU.ldapai_vendor_name ); if (!infoW->ldapai_vendor_name) { - ldap_value_free( infoU.ldapai_extensions ); + ldap_memvfree( (void **)infoU.ldapai_extensions ); return WLDAP32_LDAP_NO_MEMORY; } } infoW->ldapai_vendor_version = infoU.ldapai_vendor_version; - ldap_value_free( infoU.ldapai_extensions ); + ldap_memvfree( (void **)infoU.ldapai_extensions ); ldap_memfree( infoU.ldapai_vendor_name ); return ret; } diff --git a/dlls/wldap32/search.c b/dlls/wldap32/search.c index d5ee3605b75..99304eefb65 100644 --- a/dlls/wldap32/search.c +++ b/dlls/wldap32/search.c @@ -85,6 +85,7 @@ ULONG ldap_searchW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; + int msg; ret = WLDAP32_LDAP_NO_MEMORY; @@ -106,7 +107,13 @@ ULONG ldap_searchW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, if (!attrsU) goto exit; } - ret = ldap_search( ld, baseU, scope, filterU, attrsU, attrsonly ); + ret = ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly, + NULL, NULL, NULL, 0, &msg ); + + if (ret == LDAP_SUCCESS) + ret = msg; + else + ret = ~0UL; exit: strfreeU( baseU ); @@ -395,7 +402,8 @@ ULONG ldap_search_sW( WLDAP32_LDAP *ld, PWCHAR base, ULONG scope, PWCHAR filter, if (!attrsU) goto exit; } - ret = ldap_search_s( ld, baseU, scope, filterU, attrsU, attrsonly, res ); + ret = ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly, + NULL, NULL, NULL, 0, res ); exit: strfreeU( baseU ); @@ -476,8 +484,8 @@ ULONG ldap_search_stW( WLDAP32_LDAP *ld, const PWCHAR base, ULONG scope, if (!attrsU) goto exit; } - ret = ldap_search_st( ld, baseU, scope, filterU, attrsU, attrsonly, - (struct timeval *)timeout, res ); + ret = ldap_search_ext_s( ld, baseU, scope, filterU, attrsU, attrsonly, + NULL, NULL, (struct timeval *)timeout, 0, res ); exit: strfreeU( baseU ); diff --git a/dlls/wldap32/value.c b/dlls/wldap32/value.c index 0159bc3e131..c57351f734c 100644 --- a/dlls/wldap32/value.c +++ b/dlls/wldap32/value.c @@ -61,10 +61,10 @@ ULONG ldap_count_valuesA( PCHAR *vals ) TRACE( "(%p)\n", vals ); - if (vals) { - valsW = strarrayAtoW( vals ); - if (!valsW) return WLDAP32_LDAP_NO_MEMORY; - } + if (!vals) return 0; + + valsW = strarrayAtoW( vals ); + if (!valsW) return WLDAP32_LDAP_NO_MEMORY; ret = ldap_count_valuesW( valsW ); strarrayfreeW( valsW ); @@ -77,17 +77,18 @@ ULONG ldap_count_valuesW( PWCHAR *vals ) { ULONG ret = LDAP_NOT_SUPPORTED; #ifdef HAVE_LDAP - char **valsU = NULL; + WCHAR **p = vals; TRACE( "(%p)\n", vals ); - if (vals) { - valsU = strarrayWtoU( vals ); - if (!valsU) return WLDAP32_LDAP_NO_MEMORY; - } + if (!vals) return 0; - ret = ldap_count_values( valsU ); - strarrayfreeU( valsU ); + ret = 0; + while (*p) + { + ret++; + p++; + } #endif return ret; @@ -116,11 +117,59 @@ PCHAR *ldap_get_valuesA( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *entry, PCHAR att return ret; } +static char *bv2str( struct berval *bv ) +{ + char *str = NULL; + unsigned int len = bv->bv_len; + + str = HeapAlloc( GetProcessHeap(), 0, len + 1 ); + if (str) + { + memcpy( str, bv->bv_val, len ); + str[len] = '\0'; + } + return str; +} + +static char **bv2str_array( struct berval **bv ) +{ + unsigned int len = 0, i = 0; + struct berval **p = bv; + char **str; + + while (*p) + { + len++; + p++; + } + str = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(char *) ); + if (!str) return NULL; + + p = bv; + while (*p) + { + str[i] = bv2str( *p ); + if (!str[i]) + { + for (--i; i >= 0; i--) + HeapFree( GetProcessHeap(), 0, str[i] ); + + HeapFree( GetProcessHeap(), 0, str ); + return NULL; + } + i++; + p++; + } + str[i] = NULL; + return str; +} + PWCHAR *ldap_get_valuesW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *entry, PWCHAR attr ) { PWCHAR *ret = NULL; #ifdef HAVE_LDAP char *attrU = NULL, **retU; + struct berval **bv; TRACE( "(%p, %p, %s)\n", ld, entry, debugstr_w(attr) ); @@ -129,10 +178,13 @@ PWCHAR *ldap_get_valuesW( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *entry, PWCHAR a attrU = strWtoU( attr ); if (!attrU) return NULL; - retU = ldap_get_values( ld, entry, attrU ); + bv = ldap_get_values_len( ld, entry, attrU ); + retU = bv2str_array( bv ); ret = strarrayUtoW( retU ); - ldap_value_free( retU ); + + ldap_value_free_len( bv ); + strarrayfreeU( retU ); strfreeU( attrU ); #endif