ando@sys-net.it wrote:
ando@sys-net.it wrote:
I've seen something similar in recent code. I was just tracking it down, so you basically saved me the effort of opening a ticket :). What I found so far is that when ldap_unbind(3) is called (which is required to release resources after the connection broke), the client library tries to send a LDAPUnbind request to the server, even though it just got a LDAP_SERVER_DOWN (-1). The behavior seems to be more frequent when the connection brakes while using ldapi://, and I couldn't spot the difference up to now, I'm just mentioning it in case it rings any bells.
What happens is that when try_read1msg() finds out the connection is broken, it sets ld_errno to LDAP_SERVER_DOWN, but leaves lc->lconn_status to LDAP_CONNST_CONNECTED, so a subsequent call to ldap_unbind_ext causes ldap_free_connection() to try sending the LDAPUnbind anyway. Either we also check that ld->ld_errno is not LDAP_SERVER_DOWN (provided no one resets it in the meanwhile), or clear lc->lconn_status as soon as we find out the connection is broken. I'd go for the second, but probably someone else is more familiar than me with the library's internals.
This is the fix I propose:
========================================== diff -u -r1.154 result.c --- libraries/libldap/result.c 14 Jun 2007 20:35:41 -0000 1.154 +++ libraries/libldap/result.c 7 Sep 2007 20:57:52 -0000 @@ -558,6 +558,14 @@ if ( sock_errno() == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING; #endif ld->ld_errno = LDAP_SERVER_DOWN; +#ifdef LDAP_R_COMPILE + ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); +#endif + ldap_free_connection( ld, lc, 1, 0 ); +#ifdef LDAP_R_COMPILE + ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); +#endif + lc = *lcp = NULL; return -1;
default: ==========================================
I've prepared a trivial client that ldap_sasl_bind_s(), holds on while I shut down the server, ldap_search_ext_s() with LDAP_SERVER_DOWN and ldap_unbind_ext(). Prior to patching, I always got SIGPIPE.
p.
Ing. Pierangelo Masarati OpenLDAP Core Team
SysNet s.r.l. via Dossi, 8 - 27100 Pavia - ITALIA http://www.sys-net.it --------------------------------------- Office: +39 02 23998309 Mobile: +39 333 4963172 Email: pierangelo.masarati@sys-net.it ---------------------------------------