X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fabandon.c;h=c45d544a4dd1add0c14518f9dd63ad176b73a074;hb=34ccd14f3e8c6a02ceae11c7b0d475e17d011984;hp=b28811fa2228bb8512766567b8e297a836be3c0f;hpb=63c706ff2b2cfbef178457b770df83dedd4e3023;p=openldap diff --git a/libraries/libldap/abandon.c b/libraries/libldap/abandon.c index b28811fa22..c45d544a4d 100644 --- a/libraries/libldap/abandon.c +++ b/libraries/libldap/abandon.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2014 The OpenLDAP Foundation. + * Copyright 1998-2015 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -278,23 +278,29 @@ start_again:; } if ( lr != NULL ) { + LDAPConn *lc; + int freeconn = 0; if ( sendabandon || lr->lr_status == LDAP_REQST_WRITING ) { + freeconn = 1; + lc = lr->lr_conn; + } + if ( origid == msgid ) { + ldap_free_request( ld, lr ); + + } else { + lr->lr_abandoned = 1; + } + + if ( freeconn ) { /* 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_free_connection( ld, lc, 0, 1 ); LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex ); LDAP_MUTEX_LOCK( &ld->ld_req_mutex ); } - - if ( origid == msgid ) { - ldap_free_request( ld, lr ); - - } else { - lr->lr_abandoned = 1; - } } LDAP_MUTEX_LOCK( &ld->ld_abandon_mutex );