]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Use LDAP_OPT_KEEPCONN to prevent the target connection from being freed
authorNadezhda Ivanova <nivanova@symas.com>
Thu, 28 Feb 2019 14:46:58 +0000 (16:46 +0200)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 28 Feb 2019 17:28:04 +0000 (17:28 +0000)
On error, the ldap connection was freed and under some circumstances the fd was being reused,
which caused an assertion error in connection_init.

servers/slapd/back-asyncmeta/conn.c
servers/slapd/back-asyncmeta/meta_result.c

index 8d9690a49e61142338fdee787ae909a025cee092..5ad8b9a215fa787383394e5c629f5c9579c5613e 100644 (file)
@@ -182,6 +182,9 @@ asyncmeta_init_one_conn(
                       op->o_log_prefix, rs->sr_err );
                goto error_return;
        }
+
+       ldap_set_option( msc->msc_ld, LDAP_OPT_KEEPCONN, LDAP_OPT_ON);
+
        msc->msc_ldr = ldap_dup(msc->msc_ld);
        if (!msc->msc_ldr) {
                ldap_ld_free(msc->msc_ld, 0, NULL, NULL);
@@ -1037,7 +1040,7 @@ int asyncmeta_start_one_listener(a_metaconn_t *mc,
 
        msc = &mc->mc_conns[candidate];
        if ( slapd_shutdown || !META_BACK_CONN_INITED( msc ) || msc->msc_ld == NULL
-           || !META_IS_CANDIDATE( &candidates[ candidate ] )) {
+           || META_BACK_CONN_INVALID(msc) || !META_IS_CANDIDATE( &candidates[ candidate ] )) {
                return LDAP_SUCCESS;
        }
        bc->msgids[candidate] = candidates[candidate].sr_msgid;
index 1fa733fa24be43ac1a897047e976d0ef15e90a7a..3708b806c37ee132acbf5f3f9ff39ffe5c83113e 100644 (file)
@@ -1510,6 +1510,7 @@ again:
                if (rc < 1) {
                        if (rc < 0) {
                                ldap_get_option( mc->mc_conns[i].msc_ldr, LDAP_OPT_ERROR_NUMBER, &rc);
+                               META_BACK_CONN_INVALID_SET(&mc->mc_conns[i]);
                                asyncmeta_op_read_error(mc, i, rc, ctx);
                        }
                        ldap_pvt_thread_mutex_lock( &mc->mc_om_mutex );
@@ -1626,9 +1627,12 @@ retry_bc:
        slap_sl_mem_setctx(ctx, oldctx);
        if (mc->mc_conns) {
                ldap_pvt_thread_mutex_lock( &mc->mc_om_mutex );
-               for (i=0; i<ntargets; i++)
-                       if (mc->mc_conns[i].msc_ldr && mc->mc_conns[i].conn)
+               for (i=0; i<ntargets; i++) {
+                       if (!slapd_shutdown && !META_BACK_CONN_INVALID(msc)
+                           && mc->mc_conns[i].msc_ldr && mc->mc_conns[i].conn) {
                                connection_client_enable(mc->mc_conns[i].conn);
+                       }
+               }
                ldap_pvt_thread_mutex_unlock( &mc->mc_om_mutex );
        }
        return NULL;