From ea1eb1930369e8b268ab543f1db0f0fd5bb70bd1 Mon Sep 17 00:00:00 2001 From: Nadezhda Ivanova Date: Thu, 28 Feb 2019 16:46:58 +0200 Subject: [PATCH] Use LDAP_OPT_KEEPCONN to prevent the target connection from being freed 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 | 5 ++++- servers/slapd/back-asyncmeta/meta_result.c | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/servers/slapd/back-asyncmeta/conn.c b/servers/slapd/back-asyncmeta/conn.c index 8d9690a49e..5ad8b9a215 100644 --- a/servers/slapd/back-asyncmeta/conn.c +++ b/servers/slapd/back-asyncmeta/conn.c @@ -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; diff --git a/servers/slapd/back-asyncmeta/meta_result.c b/servers/slapd/back-asyncmeta/meta_result.c index 1fa733fa24..3708b806c3 100644 --- a/servers/slapd/back-asyncmeta/meta_result.c +++ b/servers/slapd/back-asyncmeta/meta_result.c @@ -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; imc_conns[i].msc_ldr && mc->mc_conns[i].conn) + for (i=0; imc_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;