wldap32: Avoid returning pointers from the Unix interface functions.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-11-03 18:04:14 +01:00
parent cefd34fbda
commit 3cc3dd78e1
7 changed files with 63 additions and 55 deletions

View File

@ -51,7 +51,7 @@ BerElement * CDECL ber_alloc_t( int options )
BerElement *ret;
if (!(ret = malloc( sizeof(*ret) ))) return NULL;
if (!(BER(ret) = ldap_funcs->fn_ber_alloc_t( options )))
if (ldap_funcs->fn_ber_alloc_t( options, (void **)&BER(ret) ))
{
free( ret );
return NULL;
@ -226,7 +226,7 @@ BerElement * CDECL ber_init( BERVAL *berval )
free( ret );
return NULL;
}
if (!(BER(ret) = ldap_funcs->fn_ber_init( bervalU )))
if (ldap_funcs->fn_ber_init( bervalU, (void **)&BER(ret) ))
{
free( ret );
ret = NULL;

View File

@ -75,7 +75,7 @@ WCHAR * CDECL ldap_dn2ufnW( WCHAR *dn )
if (!(dnU = strWtoU( dn ))) return NULL;
retU = ldap_funcs->fn_ldap_dn2ufn( dnU );
ldap_funcs->fn_ldap_dn2ufn( dnU, &retU );
ret = strUtoW( retU );
free( dnU );
@ -131,7 +131,7 @@ WCHAR ** CDECL ldap_explode_dnW( WCHAR *dn, ULONG notypes )
if (!(dnU = strWtoU( dn ))) return NULL;
retU = ldap_funcs->fn_ldap_explode_dn( dnU, notypes );
ldap_funcs->fn_ldap_explode_dn( dnU, notypes, &retU );
ret = strarrayUtoW( retU );
free( dnU );
@ -185,7 +185,7 @@ WCHAR * CDECL ldap_get_dnW( LDAP *ld, LDAPMessage *entry )
if (!ld || !entry) return NULL;
retU = ldap_funcs->fn_ldap_get_dn( CTX(ld), MSG(entry) );
ldap_funcs->fn_ldap_get_dn( CTX(ld), MSG(entry), &retU );
ret = strUtoW( retU );
ldap_funcs->fn_ldap_memfree( retU );

View File

@ -59,9 +59,10 @@ C_ASSERT( sizeof(struct timevalU) == sizeof(struct timeval) );
static LDAPMod *nullmods[] = { NULL };
static void * CDECL wrap_ber_alloc_t( int options )
static int CDECL wrap_ber_alloc_t( int options, void **ret )
{
return ber_alloc_t( options );
*ret = ber_alloc_t( options );
return *ret ? LDAP_SUCCESS : WLDAP32_LBER_ERROR;
}
static void CDECL wrap_ber_bvecfree( struct bervalU **berval )
@ -105,9 +106,10 @@ static void CDECL wrap_ber_free( void *ber, int freebuf )
ber_free( ber, freebuf );
}
static void * CDECL wrap_ber_init( struct bervalU *berval )
static int CDECL wrap_ber_init( struct bervalU *berval, void **ret )
{
return ber_init( (struct berval *)berval );
*ret = ber_init( (struct berval *)berval );
return *ret ? LDAP_SUCCESS : WLDAP32_LBER_ERROR;
}
static unsigned int CDECL wrap_ber_next_element( void *ber, unsigned int *ret_len, char *last )
@ -260,14 +262,16 @@ static int CDECL wrap_ldap_delete_ext_s( void *ld, const char *dn, LDAPControlU
return ldap_delete_ext_s( ld, dn ? dn : "", (LDAPControl **)serverctrls, (LDAPControl **)clientctrls );
}
static char * CDECL wrap_ldap_dn2ufn( const char *dn )
static int CDECL wrap_ldap_dn2ufn( const char *dn, char **ret )
{
return ldap_dn2ufn( dn );
*ret = ldap_dn2ufn( dn );
return *ret ? 0 : -1;
}
static char ** CDECL wrap_ldap_explode_dn( const char *dn, int notypes )
static int CDECL wrap_ldap_explode_dn( const char *dn, int notypes, char ***ret )
{
return ldap_explode_dn( dn, notypes );
*ret = ldap_explode_dn( dn, notypes );
return *ret ? 0 : -1;
}
static int CDECL wrap_ldap_extended_operation( void *ld, const char *oid, struct bervalU *data, LDAPControlU **serverctrls,
@ -285,24 +289,28 @@ static int CDECL wrap_ldap_extended_operation_s( void *ld, const char *oid, stru
(LDAPControl **)clientctrls, retoid, (struct berval **)retdata );
}
static char * CDECL wrap_ldap_get_dn( void *ld, void *entry )
static int CDECL wrap_ldap_get_dn( void *ld, void *entry, char **ret )
{
return ldap_get_dn( ld, entry );
*ret = ldap_get_dn( ld, entry );
return *ret ? 0 : -1;
}
static char * CDECL wrap_ldap_first_attribute( void *ld, void *entry, void **ber )
static int CDECL wrap_ldap_first_attribute( void *ld, void *entry, void **ber, char **ret )
{
return ldap_first_attribute( ld, entry, (BerElement **)ber );
*ret = ldap_first_attribute( ld, entry, (BerElement **)ber );
return *ret ? 0 : -1;
}
static void * CDECL wrap_ldap_first_entry( void *ld, void *chain )
static int CDECL wrap_ldap_first_entry( void *ld, void *chain, void **ret )
{
return ldap_first_entry( ld, chain );
*ret = ldap_first_entry( ld, chain );
return *ret ? 0 : -1;
}
static void * CDECL wrap_ldap_first_reference( void *ld, void *chain )
static int CDECL wrap_ldap_first_reference( void *ld, void *chain, void **ret )
{
return ldap_first_reference( ld, chain );
*ret = ldap_first_reference( ld, chain );
return *ret ? 0 : -1;
}
static int CDECL wrap_ldap_get_option( void *ld, int option, void *value )
@ -310,9 +318,10 @@ static int CDECL wrap_ldap_get_option( void *ld, int option, void *value )
return ldap_get_option( ld, option, value );
}
static struct bervalU ** CDECL wrap_ldap_get_values_len( void *ld, void *entry, const char *attr )
static int CDECL wrap_ldap_get_values_len( void *ld, void *entry, const char *attr, struct bervalU ***ret )
{
return (struct bervalU **)ldap_get_values_len( ld, entry, attr );
*ret = (struct bervalU **)ldap_get_values_len( ld, entry, attr );
return *ret ? 0 : -1;
}
static int CDECL wrap_ldap_initialize( void **ld, const char *url )
@ -350,19 +359,22 @@ static int CDECL wrap_ldap_msgfree( void *msg )
return ldap_msgfree( msg );
}
static char * CDECL wrap_ldap_next_attribute( void *ld, void *entry, void *ber )
static int CDECL wrap_ldap_next_attribute( void *ld, void *entry, void *ber, char **ret )
{
return ldap_next_attribute( ld, entry, ber );
*ret = ldap_next_attribute( ld, entry, ber );
return *ret ? 0 : -1;
}
static void * CDECL wrap_ldap_next_entry( void *ld, void *entry )
static int CDECL wrap_ldap_next_entry( void *ld, void *entry, void **ret )
{
return ldap_next_entry( ld, entry );
*ret = ldap_next_entry( ld, entry );
return *ret ? 0 : -1;
}
static void * CDECL wrap_ldap_next_reference( void *ld, void *entry )
static int CDECL wrap_ldap_next_reference( void *ld, void *entry, void **ret )
{
return ldap_next_reference( ld, entry );
*ret = ldap_next_reference( ld, entry );
return *ret ? 0 : -1;
}
static int CDECL wrap_ldap_parse_extended_result( void *ld, void *result, char **retoid, struct bervalU **retdata, int free )

View File

@ -95,13 +95,13 @@ struct sasl_interactive_bind_id
struct ldap_funcs
{
void * (CDECL *fn_ber_alloc_t)(int);
int (CDECL *fn_ber_alloc_t)(int, void **);
void (CDECL *fn_ber_bvecfree)(struct bervalU **);
void (CDECL *fn_ber_bvfree)(struct bervalU *);
unsigned int (CDECL *fn_ber_first_element)(void *, unsigned int *, char **);
int (CDECL *fn_ber_flatten)(void *, struct bervalU **);
void (CDECL *fn_ber_free)(void *, int);
void * (CDECL *fn_ber_init)(struct bervalU *);
int (CDECL *fn_ber_init)(struct bervalU *, void **);
unsigned int (CDECL *fn_ber_next_element)(void *, unsigned int *, char *);
unsigned int (CDECL *fn_ber_peek_tag)(void *, unsigned int *);
unsigned int (CDECL *fn_ber_skip_tag)(void *, unsigned int *);
@ -124,27 +124,27 @@ struct ldap_funcs
int (CDECL *fn_ldap_create_vlv_control)(void *, LDAPVLVInfoU *, LDAPControlU **);
int (CDECL *fn_ldap_delete_ext)(void *, const char *, LDAPControlU **, LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_delete_ext_s)(void *, const char *, LDAPControlU **, LDAPControlU **);
char * (CDECL *fn_ldap_dn2ufn)(const char *);
char ** (CDECL *fn_ldap_explode_dn)(const char *, int);
int (CDECL *fn_ldap_dn2ufn)(const char *, char **);
int (CDECL *fn_ldap_explode_dn)(const char *, int, char ***);
int (CDECL *fn_ldap_extended_operation)(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_extended_operation_s)(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, char **, struct bervalU **);
char * (CDECL *fn_ldap_get_dn)(void *, void *);
int (CDECL *fn_ldap_get_dn)(void *, void *, char **);
int (CDECL *fn_ldap_get_option)(void *, int, void *);
struct bervalU ** (CDECL *fn_ldap_get_values_len)(void *, void *, const char *);
int (CDECL *fn_ldap_get_values_len)(void *, void *, const char *, struct bervalU ***);
int (CDECL *fn_ldap_initialize)(void **, const char *);
char * (CDECL *fn_ldap_first_attribute)(void *, void *, void **);
void * (CDECL *fn_ldap_first_entry)(void *, void *);
void * (CDECL *fn_ldap_first_reference)(void *, void *);
int (CDECL *fn_ldap_first_attribute)(void *, void *, void **, char **);
int (CDECL *fn_ldap_first_entry)(void *, void *, void **);
int (CDECL *fn_ldap_first_reference)(void *, void *, void **);
void (CDECL *fn_ldap_memfree)(void *);
void (CDECL *fn_ldap_memvfree)(void **);
int (CDECL *fn_ldap_modify_ext)(void *, const char *, LDAPModU **, LDAPControlU **, LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_modify_ext_s)(void *, const char *, LDAPModU **, LDAPControlU **, LDAPControlU **);
int (CDECL *fn_ldap_msgfree)(void *);
char * (CDECL *fn_ldap_next_attribute)(void *, void *, void *);
void * (CDECL *fn_ldap_next_entry)(void *, void *);
void * (CDECL *fn_ldap_next_reference)(void *, void *);
int (CDECL *fn_ldap_next_attribute)(void *, void *, void *, char **);
int (CDECL *fn_ldap_next_entry)(void *, void *, void **);
int (CDECL *fn_ldap_next_reference)(void *, void *, void **);
int (CDECL *fn_ldap_parse_extended_result)(void *, void *, char **, struct bervalU **, int);
int (CDECL *fn_ldap_parse_reference)(void *, void *, char ***, LDAPControlU ***, int);
int (CDECL *fn_ldap_parse_result)(void *, void *, int *, char **, char **, char ***, LDAPControlU ***, int);

View File

@ -299,7 +299,7 @@ WCHAR * CDECL ldap_first_attributeW( LDAP *ld, LDAPMessage *entry, BerElement **
if (!ld || !entry) return NULL;
retU = ldap_funcs->fn_ldap_first_attribute( CTX(ld), MSG(entry), &berU );
ldap_funcs->fn_ldap_first_attribute( CTX(ld), MSG(entry), &berU, &retU );
if (retU && (ber = malloc( sizeof(*ber) )))
{
BER(ber) = (char *)berU;
@ -335,8 +335,7 @@ LDAPMessage * CDECL ldap_first_entry( LDAP *ld, LDAPMessage *res )
if (!ld || !res) return NULL;
msgU = ldap_funcs->fn_ldap_first_entry( CTX(ld), MSG(res) );
if (msgU)
if (!ldap_funcs->fn_ldap_first_entry( CTX(ld), MSG(res), &msgU ))
{
assert( msgU == MSG(res) );
return res;
@ -366,8 +365,7 @@ LDAPMessage * CDECL ldap_first_reference( LDAP *ld, LDAPMessage *res )
if (!ld) return NULL;
msgU = ldap_funcs->fn_ldap_first_reference( CTX(ld), MSG(res) );
if (msgU)
if (!ldap_funcs->fn_ldap_first_reference( CTX(ld), MSG(res), &msgU ))
{
assert( msgU == MSG(res) );
return res;
@ -479,8 +477,7 @@ WCHAR * CDECL ldap_next_attributeW( LDAP *ld, LDAPMessage *entry, BerElement *pt
if (!ld || !entry || !ptr) return NULL;
retU = ldap_funcs->fn_ldap_next_attribute( CTX(ld), MSG(entry), BER(ptr) );
if (retU)
if (!ldap_funcs->fn_ldap_next_attribute( CTX(ld), MSG(entry), BER(ptr), &retU ))
{
ret = strUtoW( retU );
ldap_funcs->fn_ldap_memfree( retU );
@ -516,7 +513,7 @@ LDAPMessage * CDECL ldap_next_entry( LDAP *ld, LDAPMessage *entry )
if (entry->lm_next) return entry->lm_next;
msgU = ldap_funcs->fn_ldap_next_entry( CTX(ld), MSG(entry) );
ldap_funcs->fn_ldap_next_entry( CTX(ld), MSG(entry), &msgU );
if (msgU && (msg = calloc( 1, sizeof(*msg) )))
{
MSG(msg) = msgU;
@ -553,7 +550,7 @@ LDAPMessage * CDECL ldap_next_reference( LDAP *ld, LDAPMessage *entry )
if (entry->lm_next) return entry->lm_next;
msgU = ldap_funcs->fn_ldap_next_reference( CTX(ld), MSG(entry) );
ldap_funcs->fn_ldap_next_reference( CTX(ld), MSG(entry), &msgU );
if (msgU && (msg = calloc( 1, sizeof(*msg) )))
{
MSG(msg) = msgU;

View File

@ -377,11 +377,10 @@ static BOOL query_supported_server_ctrls( LDAP *ld )
attrs, FALSE, NULL, NULL, NULL, 0, &res ) );
if (ret != LDAP_SUCCESS) return FALSE;
entry = ldap_funcs->fn_ldap_first_entry( CTX(ld), res );
if (entry)
if (!ldap_funcs->fn_ldap_first_entry( CTX(ld), res, &entry ))
{
ULONG count, i;
ctrls = ldap_funcs->fn_ldap_get_values_len( CTX(ld), entry, attrs[0] );
ldap_funcs->fn_ldap_get_values_len( CTX(ld), entry, attrs[0], &ctrls );
count = ldap_funcs->fn_ldap_count_values_len( ctrls );
for (i = 0; i < count; i++) TRACE("%u: %s\n", i, debugstr_an( ctrls[i]->bv_val, ctrls[i]->bv_len ));
*(struct bervalU ***)&SERVER_CTRLS(ld) = ctrls;

View File

@ -197,7 +197,7 @@ WCHAR ** CDECL ldap_get_valuesW( LDAP *ld, LDAPMessage *entry, WCHAR *attr )
if (!ld || !entry || !attr || !(attrU = strWtoU( attr ))) return NULL;
if ((bv = ldap_funcs->fn_ldap_get_values_len( CTX(ld), MSG(entry), attrU )))
if (!ldap_funcs->fn_ldap_get_values_len( CTX(ld), MSG(entry), attrU, &bv ))
{
retU = bv2str_array( bv );
ret = strarrayUtoW( retU );
@ -259,7 +259,7 @@ struct berval ** CDECL ldap_get_values_lenW( LDAP *ld, LDAPMessage *message, WCH
if (!ld || !message || !attr || !(attrU = strWtoU( attr ))) return NULL;
if ((retU = ldap_funcs->fn_ldap_get_values_len( CTX(ld), MSG(message), attrU )))
if (!ldap_funcs->fn_ldap_get_values_len( CTX(ld), MSG(message), attrU, &retU ))
{
ret = bvarrayUtoW( retU );
bvarrayfreeU( retU );