This is a multi-part message in MIME format.
--------------040002050003040401050402
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

Partially fixed.
Patch is for current OPENLDAP_REL_ENG_2_4, but applicable for master.

Leonid.

--

The attached files is derived from OpenLDAP Software. All of the 
modifications
to OpenLDAP Software represented in the following patch(es) were 
developed by
Peter-Service LLC, Moscow, Russia. Peter-Service LLC has not assigned rights
and/or interest in this work to any party. I, Leonid Yuriev am authorized by
Peter-Service LLC, my employer, to release this work under the following
terms.

Peter-Service LLC hereby places the following modifications to OpenLDAP 
Software
(and only these modifications) into the public domain. Hence, these
modifications may be freely used and/or redistributed for any purpose 
with or
without attribution and/or other notice.




--------------040002050003040401050402
Content-Type: text/x-patch;
 name="slapd-syncrepl-locking.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="slapd-syncrepl-locking.patch"

commit e845cfba8b8c17d291fb810b762e2d2bdb22b016
Author: Leo Yuriev <[email protected]>
Date:   2014-12-01 19:26:08 +0300

    ITS#7968: add locking into syncrepl.
    
    Mutex must be held even for a read-access of a cookie state,
    as there may be a race with write in other thread.

diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c
index caab9f5..eb7bec2 100644
--- a/servers/slapd/syncrepl.c
+++ b/servers/slapd/syncrepl.c
@@ -926,6 +926,7 @@ do_syncrep2(
                                        if ( syncCookie.ctxcsn ) {
                                                int i, sid = 
slap_parse_csn_sid( syncCookie.ctxcsn );
                                                check_syncprov( op, si );
+                                               ldap_pvt_thread_mutex_lock( 
&si->si_cookieState->cs_mutex );
                                                for ( i =0; 
i<si->si_cookieState->cs_num; i++ ) {
                                                        /* new SID */
                                                        if ( sid < 
si->si_cookieState->cs_sids[i] )
@@ -935,15 +936,18 @@ do_syncrep2(
                                                                        
bdn.bv_val[bdn.bv_len] = '\0';
                                                                        Debug( 
LDAP_DEBUG_SYNC, "do_syncrep2: %s CSN too old, ignoring %s (%s)\n",
                                                                                
si->si_ridtxt, syncCookie.ctxcsn->bv_val, bdn.bv_val );
+                                                                       
si->si_too_old = 1;
+                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex );
                                                                        
ldap_controls_free( rctrls );
                                                                        rc = 0;
-                                                                       
si->si_too_old = 1;
                                                                        goto 
done;
                                                                }
                                                                si->si_too_old 
= 0;
                                                                break;
                                                        }
                                                }
+                                               ldap_pvt_thread_mutex_unlock( 
&si->si_cookieState->cs_mutex );
+
                                                /* check pending CSNs too */
                                                while ( 
ldap_pvt_thread_mutex_trylock( &si->si_cookieState->cs_pmutex )) {
                                                        if ( slapd_shutdown ) {
@@ -953,6 +957,8 @@ do_syncrep2(
                                                        if ( 
!ldap_pvt_thread_pool_pausecheck( &connection_pool ))
                                                                
ldap_pvt_thread_yield();
                                                }
+
+                                               ldap_pvt_thread_mutex_lock( 
&si->si_cookieState->cs_mutex );
                                                for ( i =0; 
i<si->si_cookieState->cs_pnum; i++ ) {
                                                        if ( sid < 
si->si_cookieState->cs_psids[i] )
                                                                break;
@@ -961,9 +967,10 @@ do_syncrep2(
                                                                        
bdn.bv_val[bdn.bv_len] = '\0';
                                                                        Debug( 
LDAP_DEBUG_SYNC, "do_syncrep2: %s CSN pending, ignoring %s (%s)\n",
                                                                                
si->si_ridtxt, syncCookie.ctxcsn->bv_val, bdn.bv_val );
+                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex );
+                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_pmutex );
                                                                        
ldap_controls_free( rctrls );
                                                                        rc = 0;
-                                                                       
ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_pmutex );
                                                                        goto 
done;
                                                                }
                                                                ber_bvreplace( 
&si->si_cookieState->cs_pvals[i],
@@ -978,6 +985,7 @@ do_syncrep2(
                                                                (struct 
sync_cookie *)&si->si_cookieState->cs_pvals,
                                                                i, sid, 
syncCookie.ctxcsn );
                                                }
+                                               ldap_pvt_thread_mutex_unlock( 
&si->si_cookieState->cs_mutex );
                                                assert( punlock < 0 );
                                                punlock = i;
                                        } else if (si->si_too_old) {
@@ -1032,6 +1040,7 @@ do_syncrep2(
                                /* on failure, revert pending CSN */
                                if ( rc != LDAP_SUCCESS ) {
                                        int i;
+                                       ldap_pvt_thread_mutex_lock( 
&si->si_cookieState->cs_mutex );
                                        for ( i = 0; 
i<si->si_cookieState->cs_num; i++ ) {
                                                if ( 
si->si_cookieState->cs_sids[i] == si->si_cookieState->cs_psids[punlock] ) {
                                                        ber_bvreplace( 
&si->si_cookieState->cs_pvals[punlock],
@@ -1041,6 +1050,7 @@ do_syncrep2(
                                        }
                                        if ( i == si->si_cookieState->cs_num )
                                                
si->si_cookieState->cs_pvals[punlock].bv_val[0] = '\0';
+                                       ldap_pvt_thread_mutex_unlock( 
&si->si_cookieState->cs_mutex );
                                }
                                ldap_pvt_thread_mutex_unlock( 
&si->si_cookieState->cs_pmutex );
                        }


--------------040002050003040401050402--



Reply via email to