Commit 3cc3dd78 authored by Alexandre Julliard's avatar Alexandre Julliard

wldap32: Avoid returning pointers from the Unix interface functions.

parent cefd34fb
...@@ -51,7 +51,7 @@ BerElement * CDECL ber_alloc_t( int options ) ...@@ -51,7 +51,7 @@ BerElement * CDECL ber_alloc_t( int options )
BerElement *ret; BerElement *ret;
if (!(ret = malloc( sizeof(*ret) ))) return NULL; 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 ); free( ret );
return NULL; return NULL;
...@@ -226,7 +226,7 @@ BerElement * CDECL ber_init( BERVAL *berval ) ...@@ -226,7 +226,7 @@ BerElement * CDECL ber_init( BERVAL *berval )
free( ret ); free( ret );
return NULL; return NULL;
} }
if (!(BER(ret) = ldap_funcs->fn_ber_init( bervalU ))) if (ldap_funcs->fn_ber_init( bervalU, (void **)&BER(ret) ))
{ {
free( ret ); free( ret );
ret = NULL; ret = NULL;
......
...@@ -75,7 +75,7 @@ WCHAR * CDECL ldap_dn2ufnW( WCHAR *dn ) ...@@ -75,7 +75,7 @@ WCHAR * CDECL ldap_dn2ufnW( WCHAR *dn )
if (!(dnU = strWtoU( dn ))) return NULL; if (!(dnU = strWtoU( dn ))) return NULL;
retU = ldap_funcs->fn_ldap_dn2ufn( dnU ); ldap_funcs->fn_ldap_dn2ufn( dnU, &retU );
ret = strUtoW( retU ); ret = strUtoW( retU );
free( dnU ); free( dnU );
...@@ -131,7 +131,7 @@ WCHAR ** CDECL ldap_explode_dnW( WCHAR *dn, ULONG notypes ) ...@@ -131,7 +131,7 @@ WCHAR ** CDECL ldap_explode_dnW( WCHAR *dn, ULONG notypes )
if (!(dnU = strWtoU( dn ))) return NULL; 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 ); ret = strarrayUtoW( retU );
free( dnU ); free( dnU );
...@@ -185,7 +185,7 @@ WCHAR * CDECL ldap_get_dnW( LDAP *ld, LDAPMessage *entry ) ...@@ -185,7 +185,7 @@ WCHAR * CDECL ldap_get_dnW( LDAP *ld, LDAPMessage *entry )
if (!ld || !entry) return NULL; 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 ); ret = strUtoW( retU );
ldap_funcs->fn_ldap_memfree( retU ); ldap_funcs->fn_ldap_memfree( retU );
......
...@@ -59,9 +59,10 @@ C_ASSERT( sizeof(struct timevalU) == sizeof(struct timeval) ); ...@@ -59,9 +59,10 @@ C_ASSERT( sizeof(struct timevalU) == sizeof(struct timeval) );
static LDAPMod *nullmods[] = { NULL }; 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 ) static void CDECL wrap_ber_bvecfree( struct bervalU **berval )
...@@ -105,9 +106,10 @@ static void CDECL wrap_ber_free( void *ber, int freebuf ) ...@@ -105,9 +106,10 @@ static void CDECL wrap_ber_free( void *ber, int freebuf )
ber_free( ber, 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 ) 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 ...@@ -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 ); 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, 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 ...@@ -285,24 +289,28 @@ static int CDECL wrap_ldap_extended_operation_s( void *ld, const char *oid, stru
(LDAPControl **)clientctrls, retoid, (struct berval **)retdata ); (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 ) 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 ) ...@@ -310,9 +318,10 @@ static int CDECL wrap_ldap_get_option( void *ld, int option, void *value )
return ldap_get_option( ld, option, 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 ) static int CDECL wrap_ldap_initialize( void **ld, const char *url )
...@@ -350,19 +359,22 @@ static int CDECL wrap_ldap_msgfree( void *msg ) ...@@ -350,19 +359,22 @@ static int CDECL wrap_ldap_msgfree( void *msg )
return ldap_msgfree( 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 ) static int CDECL wrap_ldap_parse_extended_result( void *ld, void *result, char **retoid, struct bervalU **retdata, int free )
......
...@@ -95,13 +95,13 @@ struct sasl_interactive_bind_id ...@@ -95,13 +95,13 @@ struct sasl_interactive_bind_id
struct ldap_funcs 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_bvecfree)(struct bervalU **);
void (CDECL *fn_ber_bvfree)(struct bervalU *); void (CDECL *fn_ber_bvfree)(struct bervalU *);
unsigned int (CDECL *fn_ber_first_element)(void *, unsigned int *, char **); unsigned int (CDECL *fn_ber_first_element)(void *, unsigned int *, char **);
int (CDECL *fn_ber_flatten)(void *, struct bervalU **); int (CDECL *fn_ber_flatten)(void *, struct bervalU **);
void (CDECL *fn_ber_free)(void *, int); 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_next_element)(void *, unsigned int *, char *);
unsigned int (CDECL *fn_ber_peek_tag)(void *, unsigned int *); unsigned int (CDECL *fn_ber_peek_tag)(void *, unsigned int *);
unsigned int (CDECL *fn_ber_skip_tag)(void *, unsigned int *); unsigned int (CDECL *fn_ber_skip_tag)(void *, unsigned int *);
...@@ -124,27 +124,27 @@ struct ldap_funcs ...@@ -124,27 +124,27 @@ struct ldap_funcs
int (CDECL *fn_ldap_create_vlv_control)(void *, LDAPVLVInfoU *, LDAPControlU **); 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)(void *, const char *, LDAPControlU **, LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_delete_ext_s)(void *, const char *, LDAPControlU **, LDAPControlU **); int (CDECL *fn_ldap_delete_ext_s)(void *, const char *, LDAPControlU **, LDAPControlU **);
char * (CDECL *fn_ldap_dn2ufn)(const char *); int (CDECL *fn_ldap_dn2ufn)(const char *, char **);
char ** (CDECL *fn_ldap_explode_dn)(const char *, int); int (CDECL *fn_ldap_explode_dn)(const char *, int, char ***);
int (CDECL *fn_ldap_extended_operation)(void *, const char *, struct bervalU *, LDAPControlU **, int (CDECL *fn_ldap_extended_operation)(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, ULONG *); LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_extended_operation_s)(void *, const char *, struct bervalU *, LDAPControlU **, int (CDECL *fn_ldap_extended_operation_s)(void *, const char *, struct bervalU *, LDAPControlU **,
LDAPControlU **, char **, struct bervalU **); 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 *); 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 *); int (CDECL *fn_ldap_initialize)(void **, const char *);
char * (CDECL *fn_ldap_first_attribute)(void *, void *, void **); int (CDECL *fn_ldap_first_attribute)(void *, void *, void **, char **);
void * (CDECL *fn_ldap_first_entry)(void *, void *); int (CDECL *fn_ldap_first_entry)(void *, void *, void **);
void * (CDECL *fn_ldap_first_reference)(void *, void *); int (CDECL *fn_ldap_first_reference)(void *, void *, void **);
void (CDECL *fn_ldap_memfree)(void *); void (CDECL *fn_ldap_memfree)(void *);
void (CDECL *fn_ldap_memvfree)(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)(void *, const char *, LDAPModU **, LDAPControlU **, LDAPControlU **, ULONG *);
int (CDECL *fn_ldap_modify_ext_s)(void *, const char *, LDAPModU **, LDAPControlU **, LDAPControlU **); int (CDECL *fn_ldap_modify_ext_s)(void *, const char *, LDAPModU **, LDAPControlU **, LDAPControlU **);
int (CDECL *fn_ldap_msgfree)(void *); int (CDECL *fn_ldap_msgfree)(void *);
char * (CDECL *fn_ldap_next_attribute)(void *, void *, void *); int (CDECL *fn_ldap_next_attribute)(void *, void *, void *, char **);
void * (CDECL *fn_ldap_next_entry)(void *, void *); int (CDECL *fn_ldap_next_entry)(void *, void *, void **);
void * (CDECL *fn_ldap_next_reference)(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_extended_result)(void *, void *, char **, struct bervalU **, int);
int (CDECL *fn_ldap_parse_reference)(void *, void *, char ***, LDAPControlU ***, 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); int (CDECL *fn_ldap_parse_result)(void *, void *, int *, char **, char **, char ***, LDAPControlU ***, int);
......
...@@ -299,7 +299,7 @@ WCHAR * CDECL ldap_first_attributeW( LDAP *ld, LDAPMessage *entry, BerElement ** ...@@ -299,7 +299,7 @@ WCHAR * CDECL ldap_first_attributeW( LDAP *ld, LDAPMessage *entry, BerElement **
if (!ld || !entry) return NULL; 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) ))) if (retU && (ber = malloc( sizeof(*ber) )))
{ {
BER(ber) = (char *)berU; BER(ber) = (char *)berU;
...@@ -335,8 +335,7 @@ LDAPMessage * CDECL ldap_first_entry( LDAP *ld, LDAPMessage *res ) ...@@ -335,8 +335,7 @@ LDAPMessage * CDECL ldap_first_entry( LDAP *ld, LDAPMessage *res )
if (!ld || !res) return NULL; if (!ld || !res) return NULL;
msgU = ldap_funcs->fn_ldap_first_entry( CTX(ld), MSG(res) ); if (!ldap_funcs->fn_ldap_first_entry( CTX(ld), MSG(res), &msgU ))
if (msgU)
{ {
assert( msgU == MSG(res) ); assert( msgU == MSG(res) );
return res; return res;
...@@ -366,8 +365,7 @@ LDAPMessage * CDECL ldap_first_reference( LDAP *ld, LDAPMessage *res ) ...@@ -366,8 +365,7 @@ LDAPMessage * CDECL ldap_first_reference( LDAP *ld, LDAPMessage *res )
if (!ld) return NULL; if (!ld) return NULL;
msgU = ldap_funcs->fn_ldap_first_reference( CTX(ld), MSG(res) ); if (!ldap_funcs->fn_ldap_first_reference( CTX(ld), MSG(res), &msgU ))
if (msgU)
{ {
assert( msgU == MSG(res) ); assert( msgU == MSG(res) );
return res; return res;
...@@ -479,8 +477,7 @@ WCHAR * CDECL ldap_next_attributeW( LDAP *ld, LDAPMessage *entry, BerElement *pt ...@@ -479,8 +477,7 @@ WCHAR * CDECL ldap_next_attributeW( LDAP *ld, LDAPMessage *entry, BerElement *pt
if (!ld || !entry || !ptr) return NULL; if (!ld || !entry || !ptr) return NULL;
retU = ldap_funcs->fn_ldap_next_attribute( CTX(ld), MSG(entry), BER(ptr) ); if (!ldap_funcs->fn_ldap_next_attribute( CTX(ld), MSG(entry), BER(ptr), &retU ))
if (retU)
{ {
ret = strUtoW( retU ); ret = strUtoW( retU );
ldap_funcs->fn_ldap_memfree( retU ); ldap_funcs->fn_ldap_memfree( retU );
...@@ -516,7 +513,7 @@ LDAPMessage * CDECL ldap_next_entry( LDAP *ld, LDAPMessage *entry ) ...@@ -516,7 +513,7 @@ LDAPMessage * CDECL ldap_next_entry( LDAP *ld, LDAPMessage *entry )
if (entry->lm_next) return entry->lm_next; 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) ))) if (msgU && (msg = calloc( 1, sizeof(*msg) )))
{ {
MSG(msg) = msgU; MSG(msg) = msgU;
...@@ -553,7 +550,7 @@ LDAPMessage * CDECL ldap_next_reference( LDAP *ld, LDAPMessage *entry ) ...@@ -553,7 +550,7 @@ LDAPMessage * CDECL ldap_next_reference( LDAP *ld, LDAPMessage *entry )
if (entry->lm_next) return entry->lm_next; 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) ))) if (msgU && (msg = calloc( 1, sizeof(*msg) )))
{ {
MSG(msg) = msgU; MSG(msg) = msgU;
......
...@@ -377,11 +377,10 @@ static BOOL query_supported_server_ctrls( LDAP *ld ) ...@@ -377,11 +377,10 @@ static BOOL query_supported_server_ctrls( LDAP *ld )
attrs, FALSE, NULL, NULL, NULL, 0, &res ) ); attrs, FALSE, NULL, NULL, NULL, 0, &res ) );
if (ret != LDAP_SUCCESS) return FALSE; if (ret != LDAP_SUCCESS) return FALSE;
entry = ldap_funcs->fn_ldap_first_entry( CTX(ld), res ); if (!ldap_funcs->fn_ldap_first_entry( CTX(ld), res, &entry ))
if (entry)
{ {
ULONG count, i; 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 ); 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 )); 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; *(struct bervalU ***)&SERVER_CTRLS(ld) = ctrls;
......
...@@ -197,7 +197,7 @@ WCHAR ** CDECL ldap_get_valuesW( LDAP *ld, LDAPMessage *entry, WCHAR *attr ) ...@@ -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 (!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 ); retU = bv2str_array( bv );
ret = strarrayUtoW( retU ); ret = strarrayUtoW( retU );
...@@ -259,7 +259,7 @@ struct berval ** CDECL ldap_get_values_lenW( LDAP *ld, LDAPMessage *message, WCH ...@@ -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 (!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 ); ret = bvarrayUtoW( retU );
bvarrayfreeU( retU ); bvarrayfreeU( retU );
......
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