Commit 98dc97bc authored by Jong Hyuk Choi's avatar Jong Hyuk Choi
Browse files

memory leak fixes

parent 441ff00a
......@@ -271,7 +271,7 @@ fe_op_add( Operation *op, SlapReply *rs )
assert( (*modtail)->sml_desc != NULL );
}
rs->sr_err = slap_mods_opattrs( op, modlist, modtail,
&rs->sr_text, textbuf, textlen );
&rs->sr_text, textbuf, textlen, 1 );
if( rs->sr_err != LDAP_SUCCESS ) {
send_ldap_result( op, rs );
goto done;
......
......@@ -469,11 +469,19 @@ int backend_destroy(void)
{
int i;
BackendDB *bd;
syncinfo_t *si_entry;
ldap_pvt_thread_pool_destroy( &syncrepl_pool, 1 );
/* destroy each backend database */
for( i = 0, bd = backendDB; i < nBackendDB; i++, bd++ ) {
while ( !LDAP_STAILQ_EMPTY( &bd->be_syncinfo )) {
si_entry = LDAP_STAILQ_FIRST( &bd->be_syncinfo );
LDAP_STAILQ_REMOVE_HEAD( &bd->be_syncinfo, si_next );
syncinfo_free( si_entry );
}
if ( bd->bd_info->bi_db_destroy ) {
bd->bd_info->bi_db_destroy( bd );
}
......
......@@ -2272,7 +2272,7 @@ add_syncrepl(
}
si->si_bindmethod = LDAP_AUTH_SIMPLE;
si->si_schemachecking = 0;
ber_str2bv( "(objectclass=*)", STRLENOF("(objectclass=*)"), 0,
ber_str2bv( "(objectclass=*)", STRLENOF("(objectclass=*)"), 1,
&si->si_filterstr );
si->si_base.bv_val = NULL;
si->si_scope = LDAP_SCOPE_SUBTREE;
......@@ -2283,9 +2283,9 @@ add_syncrepl(
si->si_exattrs[0] = NULL;
si->si_type = LDAP_SYNC_REFRESH_ONLY;
si->si_interval = 86400;
si->si_retryinterval = 0;
si->si_retrynum_init = 0;
si->si_retrynum = 0;
si->si_retryinterval = NULL;
si->si_retrynum_init = NULL;
si->si_retrynum = NULL;
si->si_syncCookie.ctxcsn = NULL;
si->si_syncCookie.octet_str = NULL;
si->si_syncCookie.sid = -1;
......@@ -2310,42 +2310,7 @@ add_syncrepl(
}
if ( rc < 0 || duplicated_replica_id ) {
syncinfo_t *si_entry;
/* Something bad happened - back out */
Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 );
/* If error, remove all syncinfo */
LDAP_STAILQ_FOREACH( si_entry, &be->be_syncinfo, si_next ) {
if ( si_entry->si_updatedn.bv_val ) {
ch_free( si->si_updatedn.bv_val );
}
if ( si_entry->si_filterstr.bv_val ) {
ch_free( si->si_filterstr.bv_val );
}
if ( si_entry->si_attrs ) {
int i = 0;
while ( si_entry->si_attrs[i] != NULL ) {
ch_free( si_entry->si_attrs[i] );
i++;
}
ch_free( si_entry->si_attrs );
}
if ( si_entry->si_exattrs ) {
int i = 0;
while ( si_entry->si_exattrs[i] != NULL ) {
ch_free( si_entry->si_exattrs[i] );
i++;
}
ch_free( si_entry->si_exattrs );
}
}
while ( !LDAP_STAILQ_EMPTY( &be->be_syncinfo )) {
si_entry = LDAP_STAILQ_FIRST( &be->be_syncinfo );
LDAP_STAILQ_REMOVE_HEAD( &be->be_syncinfo, si_next );
ch_free( si_entry );
}
LDAP_STAILQ_INIT( &be->be_syncinfo );
return 1;
} else {
Debug( LDAP_DEBUG_CONFIG,
......@@ -2435,7 +2400,7 @@ parse_syncrepl_line(
si->si_provideruri_bv = (BerVarray)
ch_calloc( 2, sizeof( struct berval ));
ber_str2bv( si->si_provideruri, strlen( si->si_provideruri ),
0, &si->si_provideruri_bv[0] );
1, &si->si_provideruri_bv[0] );
si->si_provideruri_bv[1].bv_len = 0;
si->si_provideruri_bv[1].bv_val = NULL;
gots |= GOT_PROVIDER;
......@@ -2498,11 +2463,15 @@ parse_syncrepl_line(
} else if ( !strncasecmp( cargv[ i ],
AUTHCSTR, sizeof( AUTHCSTR ) - 1 ) ) {
val = cargv[ i ] + sizeof( AUTHCSTR );
if ( si->si_authcId )
ch_free( si->si_authcId );
si->si_authcId = ch_strdup( val );
} else if ( !strncasecmp( cargv[ i ],
OLDAUTHCSTR, sizeof( OLDAUTHCSTR ) - 1 ) ) {
/* Old authcID is provided for some backwards compatibility */
val = cargv[ i ] + sizeof( OLDAUTHCSTR );
if ( si->si_authcId )
ch_free( si->si_authcId );
si->si_authcId = ch_strdup( val );
} else if ( !strncasecmp( cargv[ i ],
AUTHZSTR, sizeof( AUTHZSTR ) - 1 ) ) {
......
......@@ -222,7 +222,7 @@ int slap_destroy(void)
int rc;
Debug( LDAP_DEBUG_TRACE,
"%s shutdown: freeing system resources.\n",
"%s destroy: freeing system resources.\n",
slap_name, 0, 0 );
......
......@@ -427,7 +427,7 @@ fe_op_modify( Operation *op, SlapReply *rs )
}
rs->sr_err = slap_mods_opattrs( op, modlist, modtail,
&rs->sr_text, textbuf, textlen );
&rs->sr_text, textbuf, textlen, 1 );
if( rs->sr_err != LDAP_SUCCESS ) {
send_ldap_result( op, rs );
goto cleanup;
......@@ -755,7 +755,8 @@ int slap_mods_opattrs(
Modifications *mods,
Modifications **modtail,
const char **text,
char *textbuf, size_t textlen )
char *textbuf, size_t textlen,
int manage_ctxcsn )
{
struct berval name, timestamp, csn;
struct berval nname;
......@@ -784,7 +785,7 @@ int slap_mods_opattrs(
#endif /* HAVE_GMTIME_R */
lutil_gentime( timebuf, sizeof(timebuf), ltm );
slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, 1 );
slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, manage_ctxcsn );
#ifndef HAVE_GMTIME_R
ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
......
......@@ -536,7 +536,8 @@ done:
/* empty */
}
rs->sr_err = slap_mods_opattrs( op, mod, modtail, &rs->sr_text, textbuf, textlen );
rs->sr_err = slap_mods_opattrs( op, mod, modtail,
&rs->sr_text, textbuf, textlen, 1 );
}
/* LDAP v2 supporting correct attribute handling. */
......
......@@ -631,7 +631,7 @@ refint_response(
nop.o_dn = refint_dn;
nop.o_ndn = refint_dn;
rs->sr_err = slap_mods_opattrs( &nop, nop.orm_modlist,
tail, &rs->sr_text, NULL, 0 );
tail, &rs->sr_text, NULL, 0, 1 );
nop.o_dn = nop.o_bd->be_rootdn;
nop.o_ndn = nop.o_bd->be_rootndn;
if(rs->sr_err != LDAP_SUCCESS) goto done;
......
......@@ -210,7 +210,7 @@ int passwd_extop(
* if it cares... */
rs->sr_err = slap_mods_opattrs( &op2, ml, qpw->rs_modtail, &rs->sr_text,
NULL, 0 );
NULL, 0, 1 );
if ( rs->sr_err == LDAP_SUCCESS ) {
rs->sr_err = op2.o_bd->be_modify( &op2, rs );
......
......@@ -755,7 +755,8 @@ LDAP_SLAPD_F( int ) slap_mods_opattrs(
Modifications *mods,
Modifications **modlist,
const char **text,
char *textbuf, size_t textlen );
char *textbuf, size_t textlen,
int manage_ctxcsn );
/*
* mods.c
......@@ -1225,6 +1226,7 @@ LDAP_SLAPD_F (struct berval *) slap_uuidstr_from_normalized LDAP_P((
struct berval *, struct berval *, void * ));
LDAP_SLAPD_F (int) syncrepl_isupdate LDAP_P(( Operation * ));
LDAP_SLAPD_F (int) syncrepl_isupdate_dn LDAP_P(( Backend *, struct berval * ));
LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( syncinfo_t * ));
/* syntax.c */
LDAP_SLAPD_F (Syntax *) syn_find LDAP_P((
......
......@@ -502,7 +502,7 @@ slap_auxprop_store(
if ( rc == LDAP_SUCCESS ) {
rc = slap_mods_opattrs( &op, modlist, modtail, &text, textbuf,
textlen );
textlen, 1 );
}
if ( rc == LDAP_SUCCESS ) {
......
......@@ -1435,7 +1435,6 @@ typedef struct syncinfo_s {
char *si_authcId;
char *si_authzId;
int si_schemachecking;
Filter *si_filter;
struct berval si_filterstr;
struct berval si_base;
int si_scope;
......
......@@ -463,7 +463,7 @@ slapi_int_ldapmod_to_entry(
if ( !repl_user ) {
rc = slap_mods_opattrs( op,
modlist, modtail, &text,
textbuf, textlen );
textbuf, textlen, 1 );
if ( rc != LDAP_SUCCESS) {
goto cleanup;
}
......@@ -1029,7 +1029,7 @@ slapi_modify_internal(
if ( !repl_user ) {
rs.sr_err = slap_mods_opattrs( op, modlist,
modtail, &text, textbuf,
textlen );
textlen, 1 );
if ( rs.sr_err != LDAP_SUCCESS ) {
goto cleanup;
}
......
......@@ -407,6 +407,8 @@ done:
}
}
slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx );
return rc;
}
......@@ -664,11 +666,12 @@ do_syncrep2(
for ( i = 0; syncUUIDs[i].bv_val; i++ ) {
struct berval *syncuuid_bv;
syncuuid_bv = ber_dupbv( NULL, &syncUUIDs[i] );
slap_sl_free( syncUUIDs[i].bv_val,op->o_tmpmemctx );
avl_insert( &si->si_presentlist,
(caddr_t) syncuuid_bv,
syncuuid_cmp, avl_dup_error );
}
ber_memfree_x( syncUUIDs, op->o_tmpmemctx );
slap_sl_free( syncUUIDs, op->o_tmpmemctx );
break;
default:
Debug( LDAP_DEBUG_ANY,
......@@ -747,9 +750,6 @@ done:
slap_sync_cookie_free( &syncCookie, 0 );
slap_sync_cookie_free( &syncCookie_req, 0 );
avl_free( si->si_presentlist, avl_ber_bvfree );
si->si_presentlist = NULL;
if ( res ) ldap_msgfree( res );
if ( rc && si->si_ld ) {
......@@ -832,8 +832,7 @@ do_syncrepl(
*/
if ( rc == LDAP_SUCCESS ) {
if ( first ) {
rc = connection_client_setup( s, do_syncrepl,
arg );
rc = connection_client_setup( s, do_syncrepl, arg );
} else {
connection_client_enable( s );
}
......@@ -1274,10 +1273,10 @@ syncrepl_entry(
done :
if ( syncUUID_strrep.bv_val ) {
ber_memfree_x( syncUUID_strrep.bv_val, op->o_tmpmemctx );
slap_sl_free( syncUUID_strrep.bv_val, op->o_tmpmemctx );
}
if ( si->si_syncUUID_ndn.bv_val ) {
ber_memfree_x( si->si_syncUUID_ndn.bv_val, op->o_tmpmemctx );
ch_free( si->si_syncUUID_ndn.bv_val );
}
return ret;
}
......@@ -1664,7 +1663,7 @@ syncrepl_updateCookie(
op->o_tag = LDAP_REQ_ADD;
rc = slap_mods_opattrs( op, modlist, modtail,
&text, txtbuf, textlen );
&text, txtbuf, textlen, 0 );
for ( ml = modlist; ml != NULL; ml = ml->sml_next ) {
ml->sml_op = LDAP_MOD_REPLACE;
......@@ -1807,7 +1806,7 @@ dn_callback(
Debug( LDAP_DEBUG_ANY,
"dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 );
} else {
ber_dupbv_x( &si->si_syncUUID_ndn, &rs->sr_entry->e_nname, op->o_tmpmemctx );
ber_dupbv_x( &si->si_syncUUID_ndn, &rs->sr_entry->e_nname, NULL );
}
} else if ( rs->sr_type == REP_RESULT ) {
if ( rs->sr_err == LDAP_SIZELIMIT_EXCEEDED ) {
......@@ -1982,3 +1981,98 @@ avl_ber_bvfree( void *bv )
}
ch_free( (char *) bv );
}
void
syncinfo_free( syncinfo_t *sie )
{
if ( sie->si_provideruri ) {
ch_free( sie->si_provideruri );
}
if ( sie->si_provideruri_bv ) {
ber_bvarray_free( sie->si_provideruri_bv );
}
if ( sie->si_updatedn.bv_val ) {
ch_free( sie->si_updatedn.bv_val );
}
if ( sie->si_binddn ) {
ch_free( sie->si_binddn );
}
if ( sie->si_passwd ) {
ch_free( sie->si_passwd );
}
if ( sie->si_saslmech ) {
ch_free( sie->si_saslmech );
}
if ( sie->si_secprops ) {
ch_free( sie->si_secprops );
}
if ( sie->si_realm ) {
ch_free( sie->si_realm );
}
if ( sie->si_authcId ) {
ch_free( sie->si_authcId );
}
if ( sie->si_authzId ) {
ch_free( sie->si_authzId );
}
if ( sie->si_filterstr.bv_val ) {
ch_free( sie->si_filterstr.bv_val );
}
if ( sie->si_base.bv_val ) {
ch_free( sie->si_base.bv_val );
}
if ( sie->si_attrs ) {
int i = 0;
while ( sie->si_attrs[i] != NULL ) {
ch_free( sie->si_attrs[i] );
i++;
}
ch_free( sie->si_attrs );
}
if ( sie->si_exattrs ) {
int i = 0;
while ( sie->si_exattrs[i] != NULL ) {
ch_free( sie->si_exattrs[i] );
i++;
}
ch_free( sie->si_exattrs );
}
if ( sie->si_retryinterval ) {
ch_free( sie->si_retryinterval );
}
if ( sie->si_retrynum ) {
ch_free( sie->si_retrynum );
}
if ( sie->si_retrynum_init ) {
ch_free( sie->si_retrynum_init );
}
slap_sync_cookie_free( &sie->si_syncCookie, 0 );
if ( sie->si_syncUUID_ndn.bv_val ) {
ch_free( sie->si_syncUUID_ndn.bv_val );
}
if ( sie->si_presentlist ) {
avl_free( sie->si_presentlist, avl_ber_bvfree );
}
if ( sie->si_ld ) {
ldap_ld_free( sie->si_ld, 1, NULL, NULL );
}
while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist )) {
struct nonpresent_entry* npe;
npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
LDAP_LIST_REMOVE( npe, npe_link );
if ( npe->npe_name ) {
if ( npe->npe_name->bv_val ) {
ch_free( npe->npe_name->bv_val );
}
ch_free( npe->npe_name );
}
if ( npe->npe_nname ) {
if ( npe->npe_nname->bv_val ) {
ch_free( npe->npe_nname->bv_val );
}
ch_free( npe->npe_nname );
}
ch_free( npe );
}
ch_free( sie );
}
Supports Markdown
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