]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9600 Protect connection while interacting with it
authorOndřej Kuzník <okuznik@symas.com>
Thu, 23 Sep 2021 09:18:06 +0000 (10:18 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 5 Oct 2021 10:05:25 +0000 (11:05 +0100)
servers/lloadd/monitor.c

index ac486f5aa1daf91b07ce4fb68803acc010f81d8e..65b1beddd08ee776448190c40eedda70310e4c19 100644 (file)
@@ -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;
 }
 
 /*