]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/abandon.c
ITS#7700 - Update syncrepl configuration bits with missing parameters
[openldap] / libraries / libldap / abandon.c
index ea492604b89ad0fe0a9f6492cf19b8b7eeab91d0..b9dba023e2d3d903043ab2842c0e56f499fbacc1 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2013 The OpenLDAP Foundation.
+ * Copyright 1998-2017 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -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 );
                        }
@@ -278,18 +278,29 @@ start_again:;
        }
 
        if ( lr != NULL ) {
+               LDAPConn *lc;
+               int freeconn = 0;
                if ( sendabandon || lr->lr_status == LDAP_REQST_WRITING ) {
-                       LDAP_MUTEX_LOCK( &ld->ld_conn_mutex );
-                       ldap_free_connection( ld, lr->lr_conn, 0, 1 );
-                       LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex );
+                       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, lc, 0, 1 );
+                       LDAP_MUTEX_UNLOCK( &ld->ld_conn_mutex );
+                       LDAP_MUTEX_LOCK( &ld->ld_req_mutex );
+               }
        }
 
        LDAP_MUTEX_LOCK( &ld->ld_abandon_mutex );