]> git.sur5r.net Git - openldap/commitdiff
syncinfo_free must be able to free multiple syncinfos
authorHoward Chu <hyc@openldap.org>
Tue, 13 Feb 2007 14:35:53 +0000 (14:35 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 13 Feb 2007 14:35:53 +0000 (14:35 +0000)
servers/slapd/backend.c
servers/slapd/proto-slap.h
servers/slapd/syncrepl.c

index 1cd5a622231256f63194687d30ee82c501e1cc6e..8bb21b559161b42b5437ee0607d6ddc1ff8efe22 100644 (file)
@@ -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 );
index c89c1eaa6d01829c41d2a2b8d9724e75684f0e1a..87f5133668393e8a4cc4c16d6137baa42a06e03c 100644 (file)
@@ -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((
index ff9debc68574fdf38fbabf0577d801dce39e8ad2..1b313b5bbdcea3e358547fbfd79fcaf03dc02700 100644 (file)
@@ -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;