From cbc0ec04c05711890077dcffd01e3e1300c6795c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Wed, 17 Jan 2018 15:29:58 +0000 Subject: [PATCH] Fix pinned operation forwarding --- servers/lloadd/bind.c | 1 + servers/lloadd/lload.h | 1 + servers/lloadd/operation.c | 8 ++++++++ servers/lloadd/upstream.c | 16 +++++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/servers/lloadd/bind.c b/servers/lloadd/bind.c index 071a243e53..b61a055122 100644 --- a/servers/lloadd/bind.c +++ b/servers/lloadd/bind.c @@ -476,6 +476,7 @@ handle_bind_response( if ( client->c_state == LLOAD_C_BINDING ) { switch ( result ) { case LDAP_SASL_BIND_IN_PROGRESS: + op->o_saved_msgid = op->o_client_msgid; op->o_client_msgid = 0; rc = tavl_insert( &client->c_ops, op, operation_client_cmp, avl_dup_error ); diff --git a/servers/lloadd/lload.h b/servers/lloadd/lload.h index 3ae63c1b3f..70aeade9f5 100644 --- a/servers/lloadd/lload.h +++ b/servers/lloadd/lload.h @@ -306,6 +306,7 @@ struct LloadOperation { unsigned long o_client_connid; int o_client_live, o_client_refcnt; ber_int_t o_client_msgid; + ber_int_t o_saved_msgid; LloadConnection *o_upstream; unsigned long o_upstream_connid; diff --git a/servers/lloadd/operation.c b/servers/lloadd/operation.c index ae1f893ce9..fdcbd59bdd 100644 --- a/servers/lloadd/operation.c +++ b/servers/lloadd/operation.c @@ -696,6 +696,14 @@ operation_send_reject_locked( goto done; } + if ( op->o_client_msgid == 0 ) { + assert( op->o_saved_msgid == 0 && op->o_pin_id ); + Debug( LDAP_DEBUG_TRACE, "operation_send_reject_locked: " + "operation pin=%lu is just a pin, not sending\n", + op->o_pin_id ); + goto done; + } + CONNECTION_UNLOCK_INCREF(c); ldap_pvt_thread_mutex_lock( &c->c_io_mutex ); diff --git a/servers/lloadd/upstream.c b/servers/lloadd/upstream.c index cf54dced1e..96240ad761 100644 --- a/servers/lloadd/upstream.c +++ b/servers/lloadd/upstream.c @@ -29,9 +29,20 @@ forward_response( LloadConnection *client, LloadOperation *op, BerElement *ber ) { BerElement *output; BerValue response, controls = BER_BVNULL; + ber_int_t msgid; ber_tag_t tag, response_tag; ber_len_t len; + CONNECTION_LOCK(client); + if ( op->o_client_msgid ) { + msgid = op->o_client_msgid; + } else { + assert( op->o_pin_id ); + msgid = op->o_saved_msgid; + op->o_saved_msgid = 0; + } + CONNECTION_UNLOCK(client); + response_tag = ber_skip_element( ber, &response ); tag = ber_peek_tag( ber, &len ); @@ -41,8 +52,7 @@ forward_response( LloadConnection *client, LloadOperation *op, BerElement *ber ) Debug( LDAP_DEBUG_TRACE, "forward_response: " "%s to client connid=%lu request msgid=%d\n", - lload_msgtype2str( response_tag ), op->o_client_connid, - op->o_client_msgid ); + lload_msgtype2str( response_tag ), op->o_client_connid, msgid ); ldap_pvt_thread_mutex_lock( &client->c_io_mutex ); output = client->c_pendingber; @@ -54,7 +64,7 @@ forward_response( LloadConnection *client, LloadOperation *op, BerElement *ber ) client->c_pendingber = output; ber_printf( output, "t{titOtO}", LDAP_TAG_MESSAGE, - LDAP_TAG_MSGID, op->o_client_msgid, + LDAP_TAG_MSGID, msgid, response_tag, &response, LDAP_TAG_CONTROLS, BER_BV_OPTIONAL( &controls ) );