]> git.sur5r.net Git - openldap/commitdiff
allow modules to muck with connection tree and so
authorPierangelo Masarati <ando@openldap.org>
Thu, 18 Jan 2007 00:02:29 +0000 (00:02 +0000)
committerPierangelo Masarati <ando@openldap.org>
Thu, 18 Jan 2007 00:02:29 +0000 (00:02 +0000)
servers/slapd/back-ldap/unbind.c
servers/slapd/back-meta/unbind.c

index 13f488731451f229cea01b1eaf2e192f08e4c732..b39fee77e4084175236c0d7706f845a95e06b168 100644 (file)
@@ -54,17 +54,20 @@ ldap_back_conn_destroy(
        while ( ( lc = avl_delete( &li->li_conninfo.lai_tree, (caddr_t)&lc_curr, ldap_back_conn_cmp ) ) != NULL )
        {
                Debug( LDAP_DEBUG_TRACE,
-                       "=>ldap_back_conn_destroy: destroying conn %ld (refcnt=%u)\n",
-                       LDAP_BACK_PCONN_ID( lc ), lc->lc_refcnt, 0 );
+                       "=>ldap_back_conn_destroy: destroying conn %ld "
+                       "refcnt=%d flags=0x%08x\n",
+                       LDAP_BACK_PCONN_ID( lc ),
+                       lc->lc_refcnt, lc->lc_lcflags );
 
-               assert( lc->lc_refcnt == 0 );
+               if ( lc->lc_refcnt > 0 ) {
+                       /* someone else might be accessing the connection;
+                        * mark for deletion */
+                       LDAP_BACK_CONN_CACHED_CLEAR( lc );
+                       LDAP_BACK_CONN_TAINTED_SET( lc );
 
-               /*
-                * Needs a test because the handler may be corrupted,
-                * and calling ldap_unbind on a corrupted header results
-                * in a segmentation fault
-                */
-               ldap_back_conn_free( lc );
+               } else {
+                       ldap_back_conn_free( lc );
+               }
        }
 #if LDAP_BACK_PRINT_CONNTREE > 0
        ldap_back_print_conntree( li, "<<< ldap_back_conn_destroy" );
index b63d485b24697aee2a89e071aaddf24c68765c94..42af600c05fe0ea519870a5231e1c4ff7fc1bd77 100644 (file)
@@ -57,12 +57,20 @@ meta_back_conn_destroy(
        while ( ( mc = avl_delete( &mi->mi_conninfo.lai_tree, ( caddr_t )&mc_curr, meta_back_conn_cmp ) ) != NULL )
        {
                Debug( LDAP_DEBUG_TRACE,
-                       "=>meta_back_conn_destroy: destroying conn %ld\n",
-                       LDAP_BACK_PCONN_ID( mc ), 0, 0 );
+                       "=>meta_back_conn_destroy: destroying conn %ld "
+                       "refcnt=%d flags=0x%08x\n",
+                       LDAP_BACK_PCONN_ID( mc ),
+                       mc->mc_refcnt, mc->msc_mscflags );
                
-               assert( mc->mc_refcnt == 0 );
+               if ( mc->mc_refcnt > 0 ) {
+                       /* someone else might be accessing the connection;
+                        * mark for deletion */
+                       LDAP_BACK_CONN_CACHED_CLEAR( mc );
+                       LDAP_BACK_CONN_TAINTED_SET( mc );
 
-               meta_back_conn_free( mc );
+               } else {
+                       meta_back_conn_free( mc );
+               }
        }
 #if META_BACK_PRINT_CONNTREE > 0
        meta_back_print_conntree( mi, "<<< meta_back_conn_destroy" );