From 2e2c86664a9ec31a0d605e4b6cf34446f13635e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Fri, 14 Apr 2017 09:39:24 +0100 Subject: [PATCH] There might be errors before we save the operation in c_ops --- servers/lloadd/bind.c | 4 ++-- servers/lloadd/client.c | 3 ++- servers/lloadd/operation.c | 16 ++++++++++++---- servers/lloadd/proto-slap.h | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/servers/lloadd/bind.c b/servers/lloadd/bind.c index bcdb3e1119..76cd45e365 100644 --- a/servers/lloadd/bind.c +++ b/servers/lloadd/bind.c @@ -55,7 +55,7 @@ request_bind( Operation *op ) } else if ( version != LDAP_VERSION3 ) { ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex ); operation_send_reject( - op, LDAP_PROTOCOL_ERROR, "LDAP version unsupported" ); + op, LDAP_PROTOCOL_ERROR, "LDAP version unsupported", 1 ); ber_free( copy, 0 ); return 0; } @@ -286,7 +286,7 @@ client_bind( void *ctx, void *arg ) Debug( LDAP_DEBUG_STATS, "client_bind: " "no available connection found\n" ); operation_send_reject( - op, LDAP_UNAVAILABLE, "no connections available" ); + op, LDAP_UNAVAILABLE, "no connections available", 1 ); return NULL; } diff --git a/servers/lloadd/client.c b/servers/lloadd/client.c index 1a3565916b..bb81b90bd3 100644 --- a/servers/lloadd/client.c +++ b/servers/lloadd/client.c @@ -105,7 +105,8 @@ client_read_cb( evutil_socket_t s, short what, void *arg ) fail: if ( op ) { - tavl_delete( &c->c_ops, op, operation_client_cmp ); + operation_send_reject( + op, LDAP_OTHER, "server error or overloaded", 1 ); op->o_client = NULL; operation_destroy( op ); } diff --git a/servers/lloadd/operation.c b/servers/lloadd/operation.c index e8cc3a0a9c..66021dc4b3 100644 --- a/servers/lloadd/operation.c +++ b/servers/lloadd/operation.c @@ -229,17 +229,25 @@ done: } void -operation_send_reject( Operation *op, int result, const char *msg ) +operation_send_reject( + Operation *op, + int result, + const char *msg, + int send_anyway ) { Connection *c = op->o_client; BerElement *ber; int found; + Debug( LDAP_DEBUG_TRACE, "operation_send_reject: " + "rejecting %s from client %lu with message: \"%s\"\n", + slap_msgtype2str( op->o_tag ), c->c_connid, msg ); + ldap_pvt_thread_mutex_lock( &c->c_mutex ); found = ( tavl_delete( &c->c_ops, op, operation_client_cmp ) == op ); ldap_pvt_thread_mutex_unlock( &c->c_mutex ); - if ( !found ) { + if ( !found && !send_anyway ) { return; } @@ -268,7 +276,7 @@ void operation_lost_upstream( Operation *op ) { operation_send_reject( op, LDAP_UNAVAILABLE, - "connection to the remote server has been severed" ); + "connection to the remote server has been severed", 0 ); } void * @@ -343,6 +351,6 @@ fail: if ( upstream ) { ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex ); } - operation_send_reject( op, LDAP_OTHER, "internal error" ); + operation_send_reject( op, LDAP_OTHER, "internal error", 0 ); return NULL; } diff --git a/servers/lloadd/proto-slap.h b/servers/lloadd/proto-slap.h index 16af23fc83..a945b797b8 100644 --- a/servers/lloadd/proto-slap.h +++ b/servers/lloadd/proto-slap.h @@ -151,7 +151,7 @@ LDAP_SLAPD_F (int) operation_upstream_cmp( const void *l, const void *r ); LDAP_SLAPD_F (int) operation_client_cmp( const void *l, const void *r ); LDAP_SLAPD_F (Operation *) operation_init( Connection *c, BerElement *ber ); LDAP_SLAPD_F (void) operation_abandon( Operation *op ); -LDAP_SLAPD_F (void) operation_send_reject( Operation *op, int result, const char *msg ); +LDAP_SLAPD_F (void) operation_send_reject( Operation *op, int result, const char *msg, int send_anyway ); LDAP_SLAPD_F (void) operation_lost_upstream( Operation *op ); LDAP_SLAPD_F (void) operation_destroy( Operation *op ); LDAP_SLAPD_F (void *) request_process( void *ctx, void *arg );