]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10327 Allow lockless config_back_search() during server pause
authorOndřej Kuzník <ondra@mistotebe.net>
Mon, 14 Apr 2025 16:51:06 +0000 (17:51 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 24 Apr 2025 15:24:56 +0000 (15:24 +0000)
The assumption is that the only reason it is allowed to run at this
point is that it is called from the reconfiguration context anyway.

servers/slapd/bconfig.c

index 886f120b04376d3b93546c3d0deb57b4536749ec..7200e8c338b8f9f1b1087996d213cdd5006dda0b 100644 (file)
@@ -6994,10 +6994,17 @@ config_back_search( Operation *op, SlapReply *rs )
        CfBackInfo *cfb;
        CfEntryInfo *ce, *last = NULL;
        slap_mask_t mask;
+       int paused = 0;
 
        cfb = (CfBackInfo *)op->o_bd->be_private;
 
-       ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock );
+       if ( ldap_pvt_thread_pool_query( &connection_pool,
+                       LDAP_PVT_THREAD_POOL_PARAM_PAUSED, &paused ) ) {
+               return -1;
+       }
+       if ( !paused ) {
+               ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock );
+       }
        ce = config_find_base( cfb->cb_root, &op->o_req_ndn, &last, op );
        if ( !ce ) {
                if ( last )
@@ -7032,7 +7039,8 @@ config_back_search( Operation *op, SlapReply *rs )
        }
 
 out:
-       ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
+       if ( !paused )
+               ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
        send_ldap_result( op, rs );
        return rs->sr_err;
 }