From 739f8d075394ee3e85c3f2de7aa4031b36f54c8f Mon Sep 17 00:00:00 2001 From: Rein Tollevik Date: Fri, 16 Oct 2009 17:27:18 +0000 Subject: [PATCH] ITS#6335 Don't reuse a modtarget someone is about to remove --- servers/slapd/overlays/syncprov.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index b9920698b6..85b0b8cd81 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -1324,15 +1324,14 @@ syncprov_op_cleanup( Operation *op, SlapReply *rs ) /* Remove op from lock table */ mt = opc->smt; if ( mt ) { - modinst *mi = mt->mt_mods; - + ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); + mt->mt_mods = mt->mt_mods->mi_next; /* If there are more, promote the next one */ - if ( mi->mi_next ) { - ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); - mt->mt_mods = mi->mi_next; + if ( mt->mt_mods ) { mt->mt_op = mt->mt_mods->mi_op; ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); } else { + ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); ldap_pvt_thread_mutex_lock( &si->si_mods_mutex ); avl_delete( &si->si_mods, mt, sp_avl_cmp ); ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); @@ -1946,6 +1945,15 @@ syncprov_op_mod( Operation *op, SlapReply *rs ) mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp ); if ( mt ) { ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); + if ( mt->mt_mods == NULL ) { + /* Cannot reuse this mt, as another thread is about + * to release it in syncprov_op_cleanup. + */ + ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); + mt = NULL; + } + } + if ( mt ) { ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); mt->mt_tail->mi_next = mi; mt->mt_tail = mi; -- 2.39.5