From ef60ec1df66af3dbd88bb4d2a65ea340c71219cb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Thu, 23 Sep 2021 10:18:06 +0100 Subject: [PATCH] ITS#9600 Protect connection while interacting with it --- servers/lloadd/monitor.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/servers/lloadd/monitor.c b/servers/lloadd/monitor.c index ac486f5aa1..65b1beddd0 100644 --- a/servers/lloadd/monitor.c +++ b/servers/lloadd/monitor.c @@ -536,6 +536,14 @@ lload_monitor_conn_modify( Operation *op, SlapReply *rs, Entry *e, void *priv ) { Modifications *m; LloadConnection *c = priv; + int rc = SLAP_CB_CONTINUE; + epoch_t epoch; + + if ( !acquire_ref( &c->c_refcnt ) ) { + /* Shutting down, pretend it's already happened */ + return LDAP_NO_SUCH_OBJECT; + } + epoch = epoch_join(); for ( m = op->orm_modlist; m; m = m->sml_next ) { struct berval closing = BER_BVC("closing"); @@ -546,14 +554,19 @@ lload_monitor_conn_modify( Operation *op, SlapReply *rs, Entry *e, void *priv ) if ( m->sml_desc != ad_olmConnectionState || m->sml_op != LDAP_MOD_REPLACE || m->sml_numvals != 1 || ber_bvcmp( &m->sml_nvalues[0], &closing ) ) { - return LDAP_OTHER; + rc = LDAP_CONSTRAINT_VIOLATION; + goto done; } if ( lload_connection_close( c, &gentle ) ) { - return LDAP_OTHER; + rc = LDAP_OTHER; + goto done; } } - return SLAP_CB_CONTINUE; +done: + RELEASE_REF( c, c_refcnt, c->c_destroy ); + epoch_leave( epoch ); + return rc; } /* -- 2.47.3