X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Funbind.c;h=bd4df7a8497fb6674592b28e82f7aef1784396c2;hb=a5cad3f18a4b8fbbbb1bfc5db9d00022d9ebbfc4;hp=52d535f85cb0d3a91a4273708a5d09c39cc7a8f0;hpb=74b6ab9029261fd380ef844f53e024265bfb8303;p=openldap diff --git a/libraries/libldap/unbind.c b/libraries/libldap/unbind.c index 52d535f85c..bd4df7a849 100644 --- a/libraries/libldap/unbind.c +++ b/libraries/libldap/unbind.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2006 The OpenLDAP Foundation. + * Copyright 1998-2010 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -15,16 +15,6 @@ /* Portions Copyright (c) 1990 Regents of the University of Michigan. * All rights reserved. */ -/* Portions Copyright (C) The Internet Society (1997) - * ASN.1 fragments are from RFC 2251; see RFC for full legal notices. - */ - -/* An Unbind Request looks like this: - * - * UnbindRequest ::= NULL - * - * and has no response. - */ #include "portable.h" @@ -37,6 +27,13 @@ #include "ldap-int.h" +/* An Unbind Request looks like this: + * + * UnbindRequest ::= [APPLICATION 2] NULL + * + * and has no response. (Source: RFC 4511) + */ + int ldap_unbind_ext( LDAP *ld, @@ -115,6 +112,18 @@ ldap_ld_free( ldap_pvt_thread_mutex_unlock( &ld->ld_res_mutex ); #endif + /* final close callbacks */ + { + ldaplist *ll, *next; + + 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; @@ -145,17 +154,12 @@ ldap_ld_free( LDAP_FREE( ld->ld_options.ldo_peer ); ld->ld_options.ldo_peer = NULL; } -#endif - if ( ld->ld_options.ldo_tm_api != NULL ) { - LDAP_FREE( ld->ld_options.ldo_tm_api ); - ld->ld_options.ldo_tm_api = NULL; - } - - if ( ld->ld_options.ldo_tm_net != NULL ) { - LDAP_FREE( ld->ld_options.ldo_tm_net ); - ld->ld_options.ldo_tm_net = NULL; + if ( ld->ld_options.ldo_cldapdn != NULL ) { + LDAP_FREE( ld->ld_options.ldo_cldapdn ); + ld->ld_options.ldo_cldapdn = NULL; } +#endif #ifdef HAVE_CYRUS_SASL if ( ld->ld_options.ldo_def_sasl_mech != NULL ) { @@ -261,9 +265,8 @@ ldap_send_unbind( ld->ld_errno = LDAP_SUCCESS; /* send the message */ - if ( ber_flush( sb, ber, 1 ) == -1 ) { + if ( ber_flush2( sb, ber, LBER_FLUSH_FREE_ALWAYS ) == -1 ) { ld->ld_errno = LDAP_SERVER_DOWN; - ber_free( ber, 1 ); } return( ld->ld_errno );