From 98dc97bcb922a4bcfe02b27b4f1282660be6059b Mon Sep 17 00:00:00 2001 From: Jong Hyuk Choi Date: Sat, 11 Sep 2004 02:02:09 +0000 Subject: [PATCH] memory leak fixes --- servers/slapd/add.c | 2 +- servers/slapd/backend.c | 8 +++ servers/slapd/config.c | 49 +++----------- servers/slapd/init.c | 2 +- servers/slapd/modify.c | 7 +- servers/slapd/modrdn.c | 3 +- servers/slapd/overlays/refint.c | 2 +- servers/slapd/passwd.c | 2 +- servers/slapd/proto-slap.h | 4 +- servers/slapd/sasl.c | 2 +- servers/slapd/slap.h | 1 - servers/slapd/slapi/slapi_ops.c | 4 +- servers/slapd/syncrepl.c | 114 +++++++++++++++++++++++++++++--- 13 files changed, 137 insertions(+), 63 deletions(-) diff --git a/servers/slapd/add.c b/servers/slapd/add.c index f3ad1d62c4..d4f6b6b914 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -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; diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index e01cc20ac8..349b7a621c 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -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 ); } diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 3d85794ce8..0db76d05ad 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -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 ) ) { diff --git a/servers/slapd/init.c b/servers/slapd/init.c index 8ec751a958..40def39a95 100644 --- a/servers/slapd/init.c +++ b/servers/slapd/init.c @@ -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 ); diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index 908a4a841f..1b707e175f 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -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 ); diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index db5a99f680..f5c8a33bf0 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -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. */ diff --git a/servers/slapd/overlays/refint.c b/servers/slapd/overlays/refint.c index fb8f229324..987ffc3204 100644 --- a/servers/slapd/overlays/refint.c +++ b/servers/slapd/overlays/refint.c @@ -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; diff --git a/servers/slapd/passwd.c b/servers/slapd/passwd.c index 6832098f95..89247b54f8 100644 --- a/servers/slapd/passwd.c +++ b/servers/slapd/passwd.c @@ -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 ); diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index f6e78692bc..c5b71729ce 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -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(( diff --git a/servers/slapd/sasl.c b/servers/slapd/sasl.c index 44313a51a8..f00d0ab6b8 100644 --- a/servers/slapd/sasl.c +++ b/servers/slapd/sasl.c @@ -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 ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 10804f08a5..9fa5fc22e6 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -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; diff --git a/servers/slapd/slapi/slapi_ops.c b/servers/slapd/slapi/slapi_ops.c index 1a3aa22053..c8e9783803 100644 --- a/servers/slapd/slapi/slapi_ops.c +++ b/servers/slapd/slapi/slapi_ops.c @@ -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; } diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 895f11c8ca..cb39b532c8 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -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 ); +} -- 2.39.5