-#ifndef NO_CACHE
- if ( ld->ld_cache != NULL )
- ldap_destroy_cache( ld );
-#endif /* !NO_CACHE */
- if ( ld->ld_error != NULL )
- free( ld->ld_error );
- if ( ld->ld_matched != NULL )
- free( ld->ld_matched );
- if ( ld->ld_host != NULL )
- free( ld->ld_host );
- if ( ld->ld_ufnprefix != NULL )
- free( ld->ld_ufnprefix );
- if ( ld->ld_filtd != NULL )
- ldap_getfilter_free( ld->ld_filtd );
-#ifndef LDAP_REFERRALS
- if ( ld->ld_sb.sb_ber.ber_buf != NULL )
- free( ld->ld_sb.sb_ber.ber_buf );
-#endif /* !LDAP_REFERRALS */
- if ( ld->ld_abandoned != NULL )
- free( ld->ld_abandoned );
-
-#ifdef LDAP_REFERRALS
- if ( ld->ld_selectinfo != NULL )
+ for ( ll = ld->ld_options.ldo_conn_cbs; ll; ll = next ) {
+ ldap_conncb *cb = ll->ll_data;
+ next = ll->ll_next;
+ cb->lc_del( ld, NULL, cb );
+ LDAP_FREE( ll );
+ }
+ }
+
+ if ( ld->ld_error != NULL ) {
+ LDAP_FREE( ld->ld_error );
+ ld->ld_error = NULL;
+ }
+
+ if ( ld->ld_matched != NULL ) {
+ LDAP_FREE( ld->ld_matched );
+ ld->ld_matched = NULL;
+ }
+
+ if( ld->ld_referrals != NULL) {
+ LDAP_VFREE(ld->ld_referrals);
+ ld->ld_referrals = NULL;
+ }
+
+ if ( ld->ld_selectinfo != NULL ) {