]> git.sur5r.net Git - openldap/commitdiff
ITS#7967 fix abandon regression
authorHoward Chu <hyc@openldap.org>
Wed, 15 Oct 2014 10:08:29 +0000 (11:08 +0100)
committerHoward Chu <hyc@openldap.org>
Wed, 15 Oct 2014 10:08:29 +0000 (11:08 +0100)
From ITS#7712, avoid double-free of request

libraries/libldap/abandon.c

index b28811fa2228bb8512766567b8e297a836be3c0f..478ff20284399440d587f39f8d08ac7949fe4138 100644 (file)
@@ -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 );