]> git.sur5r.net Git - openldap/commitdiff
ITS#5484,ITS#5451
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 1 May 2008 23:24:35 +0000 (23:24 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 1 May 2008 23:24:35 +0000 (23:24 +0000)
CHANGES
servers/slapd/overlays/syncprov.c

diff --git a/CHANGES b/CHANGES
index 2b1b70342d2406c44898c0bbd6e24d0180c9049f..00b3642c7fd7ea0c2998960b287de6d5b99781eb 100644 (file)
--- 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
index 9d7a9ad72154672bf4a44414170eb5de9a5fc551..0551f1e93380a1f533e548413927123da68cf1ec 100644 (file)
@@ -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,