diff --git a/servers/lloadd/client.c b/servers/lloadd/client.c index cd9d4c8d85..0fcfd6f65c 100644 --- a/servers/lloadd/client.c +++ b/servers/lloadd/client.c @@ -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 ); diff --git a/servers/lloadd/connection.c b/servers/lloadd/connection.c index 8c6634f965..1eb92c0a92 100644 --- a/servers/lloadd/connection.c +++ b/servers/lloadd/connection.c @@ -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); diff --git a/servers/lloadd/upstream.c b/servers/lloadd/upstream.c index ebf4a176a7..9aa3bd7d64 100644 --- a/servers/lloadd/upstream.c +++ b/servers/lloadd/upstream.c @@ -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: "