/* unbind.c - ldap backend unbind function */
/* $OpenLDAP$ */
-
+/*
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+/* This is an altered version */
/*
* Copyright 1999, Howard Chu, All rights reserved. <hyc@highlandsun.com>
*
* ever read sources, credits should appear in the documentation.
*
* 4. This notice may not be removed or altered.
+ *
+ *
+ *
+ * Copyright 2000, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
+ *
+ * This software is being modified by Pierangelo Masarati.
+ * The previously reported conditions apply to the modified code as well.
+ * Changes in the original code are highlighted where required.
+ * Credits for the original code go to the author, Howard Chu.
*/
#include "portable.h"
)
{
struct ldapinfo *li = (struct ldapinfo *) be->be_private;
- struct ldapconn *lc, *lp;
+ struct ldapconn *lc, lc_curr;
+
+#ifdef NEW_LOGGING
+ LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
+ "ldap_back_conn_destroy: fetching conn %ld\n",
+ conn->c_connid ));
+#else /* !NEW_LOGGING */
+ Debug( LDAP_DEBUG_TRACE,
+ "=>ldap_back_conn_destroy: fetching conn %ld\n",
+ conn->c_connid, 0, 0 );
+#endif /* !NEW_LOGGING */
+ lc_curr.conn = conn;
+
ldap_pvt_thread_mutex_lock( &li->conn_mutex );
- for (lc = li->lcs, lp = (struct ldapconn *)&li->lcs; lc;
- lp=lc, lc=lc->next)
- if (lc->conn == conn) {
- lp->next = lc->next;
- break;
- }
+ lc = avl_delete( &li->conntree, (caddr_t)&lc_curr, ldap_back_conn_cmp );
ldap_pvt_thread_mutex_unlock( &li->conn_mutex );
if (lc) {
- if (lc->bound)
- ldap_unbind(lc->ld);
- free(lc);
+ Debug( LDAP_DEBUG_TRACE,
+ "=>ldap_back_conn_destroy: destroying conn %ld\n",
+ lc->conn->c_connid, 0, 0 );
+
+#ifdef ENABLE_REWRITE
+ /*
+ * Cleanup rewrite session
+ */
+ rewrite_session_delete( li->rwinfo, conn );
+#endif /* ENABLE_REWRITE */
+
+ /*
+ * Needs a test because the handler may be corrupted,
+ * and calling ldap_unbind on a corrupted header results
+ * in a segmentation fault
+ */
+ ldap_unbind(lc->ld);
+ if ( lc->bound_dn.bv_val ) {
+ free( lc->bound_dn.bv_val );
+ }
+ free( lc );
}
/* no response to unbind */