]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Clean up events properly
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 9 May 2017 17:02:28 +0000 (18:02 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:55:46 +0000 (17:55 +0000)
servers/lloadd/client.c
servers/lloadd/upstream.c

index dd85b26a22fd42df3bb8ef30336e8833cc48235e..6a5801f34d984344ac902b4f23daf2df1a21dbf0 100644 (file)
@@ -278,12 +278,12 @@ client_init(
     return c;
 fail:
     if ( c->c_write_event ) {
-        event_del( c->c_write_event );
         event_free( c->c_write_event );
+        c->c_write_event = NULL;
     }
     if ( c->c_read_event ) {
-        event_del( c->c_read_event );
         event_free( c->c_read_event );
+        c->c_read_event = NULL;
     }
     c->c_state = SLAP_C_INVALID;
     connection_destroy( c );
@@ -298,13 +298,13 @@ client_destroy( Connection *c )
             c->c_connid );
 
     if ( c->c_read_event ) {
-        event_del( c->c_read_event );
         event_free( c->c_read_event );
+        c->c_read_event = NULL;
     }
 
     if ( c->c_write_event ) {
-        event_del( c->c_write_event );
         event_free( c->c_write_event );
+        c->c_write_event = NULL;
     }
 
     c->c_state = SLAP_C_INVALID;
index 54f157f60d2d185cdbd77eeff163a945013f4b28..b36051f69e0d5dfe78216b1cd3f3b9080aada6a5 100644 (file)
@@ -870,11 +870,13 @@ upstream_destroy( Connection *c )
      * event_del will block if the event is currently executing its callback,
      * that callback might be waiting to lock c->c_mutex
      */
-    event_del( read_event );
-    event_free( read_event );
+    if ( read_event ) {
+        event_del( read_event );
+    }
 
-    event_del( write_event );
-    event_free( write_event );
+    if ( write_event ) {
+        event_del( write_event );
+    }
 
     ldap_pvt_thread_mutex_lock( &b->b_mutex );
     LDAP_LIST_REMOVE( c, c_next );
@@ -889,6 +891,16 @@ upstream_destroy( Connection *c )
 
     CONNECTION_LOCK_DECREF(c);
 
+    if ( c->c_read_event ) {
+        event_free( c->c_read_event );
+        c->c_read_event = NULL;
+    }
+
+    if ( c->c_write_event ) {
+        event_free( c->c_write_event );
+        c->c_write_event = NULL;
+    }
+
     /*
      * If we attempted to destroy any operations, we might have lent a new
      * refcnt token for a thread that raced us to that, let them call us again