From 77f2c5713247d6f3aafc16c757e6b5b0715263c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Tue, 9 May 2017 16:19:14 +0100 Subject: [PATCH] Reset c_*ber after freeing and check c_pendingber race --- servers/lloadd/client.c | 3 ++- servers/lloadd/connection.c | 2 ++ servers/lloadd/upstream.c | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) 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: "