X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fabandon.c;h=8fd9bc25874f1c1b53f0832cc4557755a289d5b3;hb=4b1c935cd19f7255529a8b84210c4cd19b11481a;hp=ea492604b89ad0fe0a9f6492cf19b8b7eeab91d0;hpb=1da5f1faf052e05c1a23b1663aed1d2cabca5008;p=openldap diff --git a/libraries/libldap/abandon.c b/libraries/libldap/abandon.c index ea492604b8..8fd9bc2587 100644 --- a/libraries/libldap/abandon.c +++ b/libraries/libldap/abandon.c @@ -209,7 +209,7 @@ start_again:; LDAP_NEXT_MSGID(ld, i); #ifdef LDAP_CONNECTIONLESS if ( LDAP_IS_UDP(ld) ) { - struct sockaddr sa = {0}; + struct sockaddr_storage sa = {0}; /* dummy, filled with ldo_peer in request.c */ err = ber_write( ber, (char *) &sa, sizeof(sa), 0 ); } @@ -279,9 +279,14 @@ start_again:; if ( lr != NULL ) { if ( sendabandon || lr->lr_status == LDAP_REQST_WRITING ) { + /* release ld_req_mutex while grabbing ld_conn_mutex to + * prevent deadlock. + */ + LDAP_MUTEX_UNLOCK( &ld->ld_req_mutex ); LDAP_MUTEX_LOCK( &ld->ld_conn_mutex ); ldap_free_connection( ld, lr->lr_conn, 0, 1 ); LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex ); + LDAP_MUTEX_LOCK( &ld->ld_req_mutex ); } if ( origid == msgid ) {