From: Nadezhda Ivanova Date: Thu, 28 Feb 2019 14:46:58 +0000 (+0200) Subject: Use LDAP_OPT_KEEPCONN to prevent the target connection from being freed X-Git-Tag: OPENLDAP_REL_ENG_2_5_0ALPHA~67^2~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea1eb1930369e8b268ab543f1db0f0fd5bb70bd1;p=thirdparty%2Fopenldap.git 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. --- 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;