From 59d4b38a7c9247d13bbff43c73c253929e348fdf Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 13 Feb 2007 14:35:53 +0000 Subject: [PATCH] syncinfo_free must be able to free multiple syncinfos --- servers/slapd/backend.c | 2 +- servers/slapd/proto-slap.h | 2 +- servers/slapd/syncrepl.c | 198 ++++++++++++++++++++----------------- 3 files changed, 108 insertions(+), 94 deletions(-) diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 1cd5a62223..8bb21b5591 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -422,7 +422,7 @@ void backend_destroy_one( BackendDB *bd, int dynamic ) } if ( bd->be_syncinfo ) { - syncinfo_free( bd->be_syncinfo ); + syncinfo_free( bd->be_syncinfo, 1 ); } backend_stopdown_one( bd ); diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index c89c1eaa6d..87f5133668 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1673,7 +1673,7 @@ LDAP_SLAPD_F (Filter *) str2filter_x LDAP_P(( Operation *op, const char *str )); LDAP_SLAPD_F (int) syncrepl_add_glue LDAP_P(( Operation*, Entry* )); -LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( struct syncinfo_s * )); +LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( struct syncinfo_s *, int all )); /* syntax.c */ LDAP_SLAPD_F (Syntax *) syn_find LDAP_P(( diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index ff9debc685..1b313b5bbd 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -1251,10 +1251,11 @@ reload: cs = be->be_syncinfo->si_cookieState; for ( sip = &be->be_syncinfo; *sip != si; sip = &(*sip)->si_next ); *sip = si->si_next; - syncinfo_free( si ); + syncinfo_free( si, 0 ); if ( !be->be_syncinfo ) { SLAP_DBFLAGS( be ) &= ~(SLAP_DBFLAG_SHADOW|SLAP_DBFLAG_SYNC_SHADOW); if ( cs ) { + ch_free( cs->cs_sids ); ber_bvarray_free( cs->cs_vals ); ldap_pvt_thread_mutex_destroy( &cs->cs_mutex ); ch_free( cs ); @@ -3067,106 +3068,119 @@ avl_ber_bvfree( void *v_bv ) } void -syncinfo_free( syncinfo_t *sie ) +syncinfo_free( syncinfo_t *sie, int free_all ) { - if ( sie->si_ld ) { - if ( sie->si_conn_setup ) { - ber_socket_t s; - ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s ); - connection_client_stop( s ); - sie->si_conn_setup = 0; - } - ldap_unbind_ext( sie->si_ld, NULL, NULL ); - } + syncinfo_t *si_next; - /* re-fetch it, in case it was already removed */ - sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie ); - if ( sie->si_re ) { - if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) ) - ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re ); - ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re ); + if ( free_all && sie->si_cookieState ) { + ch_free( sie->si_cookieState->cs_sids ); + ber_bvarray_free( sie->si_cookieState->cs_vals ); + ldap_pvt_thread_mutex_destroy( &sie->si_cookieState->cs_mutex ); + ch_free( sie->si_cookieState ); } + do { + si_next = sie->si_next; - ldap_pvt_thread_mutex_destroy( &sie->si_mutex ); - - bindconf_free( &sie->si_bindconf ); - - if ( sie->si_filterstr.bv_val ) { - ch_free( sie->si_filterstr.bv_val ); - } - if ( sie->si_logfilterstr.bv_val ) { - ch_free( sie->si_logfilterstr.bv_val ); - } - if ( sie->si_base.bv_val ) { - ch_free( sie->si_base.bv_val ); - } - if ( sie->si_logbase.bv_val ) { - ch_free( sie->si_logbase.bv_val ); - } - if ( sie->si_attrs ) { - int i = 0; - while ( sie->si_attrs[i] != NULL ) { - ch_free( sie->si_attrs[i] ); - i++; + if ( sie->si_ld ) { + if ( sie->si_conn_setup ) { + ber_socket_t s; + ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s ); + connection_client_stop( s ); + sie->si_conn_setup = 0; + } + ldap_unbind_ext( sie->si_ld, NULL, NULL ); } - 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++; + + /* re-fetch it, in case it was already removed */ + sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie ); + if ( sie->si_re ) { + if ( ldap_pvt_runqueue_isrunning( &slapd_rq, sie->si_re ) ) + ldap_pvt_runqueue_stoptask( &slapd_rq, sie->si_re ); + ldap_pvt_runqueue_remove( &slapd_rq, sie->si_re ); } - ch_free( sie->si_exattrs ); - } - if ( sie->si_anlist ) { - int i = 0; - while ( sie->si_anlist[i].an_name.bv_val != NULL ) { - ch_free( sie->si_anlist[i].an_name.bv_val ); - i++; + + ldap_pvt_thread_mutex_destroy( &sie->si_mutex ); + + bindconf_free( &sie->si_bindconf ); + + if ( sie->si_filterstr.bv_val ) { + ch_free( sie->si_filterstr.bv_val ); } - ch_free( sie->si_anlist ); - } - if ( sie->si_exanlist ) { - int i = 0; - while ( sie->si_exanlist[i].an_name.bv_val != NULL ) { - ch_free( sie->si_exanlist[i].an_name.bv_val ); - i++; + if ( sie->si_logfilterstr.bv_val ) { + ch_free( sie->si_logfilterstr.bv_val ); } - ch_free( sie->si_exanlist ); - } - 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_presentlist ) { - avl_free( sie->si_presentlist, avl_ber_bvfree ); - } - 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 ); + if ( sie->si_base.bv_val ) { + ch_free( sie->si_base.bv_val ); + } + if ( sie->si_logbase.bv_val ) { + ch_free( sie->si_logbase.bv_val ); + } + if ( sie->si_attrs ) { + int i = 0; + while ( sie->si_attrs[i] != NULL ) { + ch_free( sie->si_attrs[i] ); + i++; } - ch_free( npe->npe_name ); + ch_free( sie->si_attrs ); } - if ( npe->npe_nname ) { - if ( npe->npe_nname->bv_val ) { - ch_free( npe->npe_nname->bv_val ); + if ( sie->si_exattrs ) { + int i = 0; + while ( sie->si_exattrs[i] != NULL ) { + ch_free( sie->si_exattrs[i] ); + i++; } - ch_free( npe->npe_nname ); + ch_free( sie->si_exattrs ); } - ch_free( npe ); - } - ch_free( sie ); + if ( sie->si_anlist ) { + int i = 0; + while ( sie->si_anlist[i].an_name.bv_val != NULL ) { + ch_free( sie->si_anlist[i].an_name.bv_val ); + i++; + } + ch_free( sie->si_anlist ); + } + if ( sie->si_exanlist ) { + int i = 0; + while ( sie->si_exanlist[i].an_name.bv_val != NULL ) { + ch_free( sie->si_exanlist[i].an_name.bv_val ); + i++; + } + ch_free( sie->si_exanlist ); + } + 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_presentlist ) { + avl_free( sie->si_presentlist, avl_ber_bvfree ); + } + 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 ); + sie = si_next; + } while ( free_all && si_next ); } @@ -3703,7 +3717,7 @@ add_syncrepl( Debug( LDAP_DEBUG_ANY, "version %d incompatible with syncrepl\n", si->si_bindconf.sb_version, 0, 0 ); - syncinfo_free( si ); + syncinfo_free( si, 0 ); return 1; } @@ -3746,7 +3760,7 @@ add_syncrepl( #endif if ( rc < 0 ) { Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 ); - syncinfo_free( si ); + syncinfo_free( si, 0 ); return 1; } else { Debug( LDAP_DEBUG_CONFIG, @@ -3965,7 +3979,7 @@ syncrepl_config( ConfigArgs *c ) ldap_pvt_runqueue_isrunning( &slapd_rq, si->si_re ) ) { si->si_ctype = 0; } else { - syncinfo_free( si ); + syncinfo_free( si, 0 ); } if ( i == c->valx ) break; -- 2.39.5