From: Quanah Gibson-Mount Date: Thu, 1 May 2008 23:24:35 +0000 (+0000) Subject: ITS#5484,ITS#5451 X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~14 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=76754855e81c68071d79e7f06978c4f394ca4228;p=openldap ITS#5484,ITS#5451 --- diff --git a/CHANGES b/CHANGES index 2b1b70342d..00b3642c7f 100644 --- a/CHANGES +++ b/CHANGES @@ -46,6 +46,8 @@ OpenLDAP 2.4.9 Engineering Fixed slapo-syncprov/glue search ops (ITS#5434) Fixed slapo-syncprov null cookie (ITS#5437,#5444) Fixed slapo-syncprov double-free (ITS#5445) + Fixed slapo-syncprov free syncop correctly (ITS#5484) + Fixed slapo-syncprov glue deadlock (ITS#5451) Build Environment Fixed leave function naming for OSF1 (ITS#5411) Documentation diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 9d7a9ad721..0551f1e933 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -737,6 +737,13 @@ syncprov_free_syncop( syncops *so ) ldap_pvt_thread_mutex_unlock( &so->s_mutex ); return; } + if ( so->s_qtask ) { + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); + if ( ldap_pvt_runqueue_isrunning( &slapd_rq, so->s_qtask ) ) + ldap_pvt_runqueue_stoptask( &slapd_rq, so->s_qtask ); + ldap_pvt_runqueue_remove( &slapd_rq, so->s_qtask ); + ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + } ldap_pvt_thread_mutex_unlock( &so->s_mutex ); if ( so->s_flags & PS_IS_DETACHED ) { filter_free( so->s_op->ors_filter ); @@ -1173,6 +1180,9 @@ syncprov_matchops( Operation *op, opcookie *opc, int saveit ) int found = 0; snext = ss->s_next; + if ( ss->s_op->o_abandon ) + continue; + /* validate base */ fc.fss = ss; fc.fbase = 0; @@ -2389,7 +2399,14 @@ syncprov_operational( if ( !ap ) { if ( !(rs->sr_flags & REP_ENTRY_MODIFIABLE) ) { - rs->sr_entry = entry_dup( rs->sr_entry ); + Entry *e = entry_dup( rs->sr_entry ); + if ( rs->sr_flags & REP_ENTRY_MUSTRELEASE ) { + overlay_entry_release_ov( op, rs->sr_entry, 0, on ); + rs->sr_flags ^= REP_ENTRY_MUSTRELEASE; + } else if ( rs->sr_flags & REP_ENTRY_MUSTBEFREED ) { + entry_free( rs->sr_entry ); + } + rs->sr_entry = e; rs->sr_flags |= REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED; a = attr_find( rs->sr_entry->e_attrs,