mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
syncinfo_free must be able to free multiple syncinfos
This commit is contained in:
parent
f649d8a29c
commit
59d4b38a7c
@ -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 );
|
||||
|
@ -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((
|
||||
|
@ -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++;
|
||||
}
|
||||
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_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 );
|
||||
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;
|
||||
}
|
||||
ch_free( npe->npe_name );
|
||||
ldap_unbind_ext( sie->si_ld, NULL, NULL );
|
||||
}
|
||||
if ( npe->npe_nname ) {
|
||||
if ( npe->npe_nname->bv_val ) {
|
||||
ch_free( npe->npe_nname->bv_val );
|
||||
|
||||
/* 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 );
|
||||
}
|
||||
|
||||
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++;
|
||||
}
|
||||
ch_free( npe->npe_nname );
|
||||
ch_free( sie->si_attrs );
|
||||
}
|
||||
ch_free( npe );
|
||||
}
|
||||
ch_free( sie );
|
||||
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_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;
|
||||
|
Loading…
Reference in New Issue
Block a user