From 1df68c05e00cf6049f8e6b61349498d301b34ebd Mon Sep 17 00:00:00 2001 From: Jan Synacek Date: Fri, 1 Nov 2013 08:14:09 +0100 Subject: [PATCH] fix possible race conditions --- servers/slapd/back-ldap/search.c | 8 +++++++- servers/slapd/connection.c | 2 ++ servers/slapd/overlays/rwm.c | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c index 094d76e..5aa96ec 100644 --- a/servers/slapd/back-ldap/search.c +++ b/servers/slapd/back-ldap/search.c @@ -300,7 +300,11 @@ retry: for ( rc = -2; rc != -1; rc = ldap_result( lc->lc_ld, msgid, LDAP_MSG_ONE, &tv, &res ) ) { /* check for abandon */ - if ( op->o_abandon || LDAP_BACK_CONN_ABANDON( lc ) ) { + ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); + int abandon = op->o_abandon; + ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); + + if ( abandon || LDAP_BACK_CONN_ABANDON( lc ) ) { if ( rc > 0 ) { ldap_msgfree( res ); } @@ -611,7 +615,9 @@ finish:; if ( rc != SLAPD_ABANDON ) #endif { + ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); send_ldap_result( op, rs ); + ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); } (void)ldap_back_controls_free( op, rs, &ctrls ); diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 7ed3f63..7322838 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -1093,6 +1093,7 @@ connection_operation( void *ctx, void *arg_v ) goto operations_error; } + ldap_pvt_thread_mutex_lock( &conn->c_mutex ); #ifdef LDAP_X_TXN if (( conn->c_txn == CONN_TXN_SPECIFY ) && ( ( tag == LDAP_REQ_ADD ) || @@ -1127,6 +1128,7 @@ connection_operation( void *ctx, void *arg_v ) ber_set_option( op->o_ber, LBER_OPT_BER_MEMCTX, &memctx ); } } + ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); opidx = slap_req2op( tag ); assert( opidx != SLAP_OP_LAST ); diff --git a/servers/slapd/overlays/rwm.c b/servers/slapd/overlays/rwm.c index 35769d1..3b5cd36 100644 --- a/servers/slapd/overlays/rwm.c +++ b/servers/slapd/overlays/rwm.c @@ -1020,7 +1020,9 @@ error_return:; op->o_tmpfree( roc, op->o_tmpmemctx ); op->o_bd->bd_info = (BackendInfo *)on->on_info; + ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); send_ldap_error( op, rs, rc, text ); + ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); return -1; -- 1.8.3.1