]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Reset c_*ber after freeing and check c_pendingber race
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 9 May 2017 15:19:14 +0000 (16:19 +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/connection.c
servers/lloadd/upstream.c

index cd9d4c8d855921d09605244508564f3ad009adb3..0fcfd6f65c6643912ca2ecae5e870af5078c43d6 100644 (file)
@@ -210,7 +210,8 @@ client_write_cb( evutil_socket_t s, short what, void *arg )
             "have something to write to client %lu\n",
             c->c_connid );
 
-    if ( ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
+    /* We might have been beaten to flushing the data by another thread */
+    if ( c->c_pendingber && ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
         int err = sock_errno();
         if ( err != EWOULDBLOCK && err != EAGAIN ) {
             ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
index 8c6634f9655500085c054b441bf9539920c1bc29..1eb92c0a929dc3096dbdcc081a9ed386464732d6 100644 (file)
@@ -66,9 +66,11 @@ connection_destroy( Connection *c )
 
     if ( c->c_currentber ) {
         ber_free( c->c_currentber, 1 );
+        c->c_currentber = NULL;
     }
     if ( c->c_pendingber ) {
         ber_free( c->c_pendingber, 1 );
+        c->c_pendingber = NULL;
     }
 
     CONNECTION_UNLOCK(c);
index ebf4a176a70a6804418581620871b6574a803f4a..9aa3bd7d644752821aefb73c1ba7ff1fc4d34d97 100644 (file)
@@ -677,7 +677,8 @@ upstream_write_cb( evutil_socket_t s, short what, void *arg )
             "have something to write to upstream %lu\n",
             c->c_connid );
 
-    if ( ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
+    /* We might have been beaten to flushing the data by another thread */
+    if ( c->c_pendingber && ber_flush( c->c_sb, c->c_pendingber, 1 ) ) {
         int err = sock_errno();
         if ( err != EWOULDBLOCK && err != EAGAIN ) {
             Debug( LDAP_DEBUG_ANY, "upstream_write_cb: "