]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9761 Fix olcSyncrepl position based insertion
authorOndřej Kuzník <ondra@mistotebe.net>
Wed, 8 Dec 2021 15:47:45 +0000 (15:47 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 4 Jan 2022 17:53:26 +0000 (17:53 +0000)
servers/slapd/syncrepl.c
tests/scripts/test086-delta-consumer-config

index 96d84b4cc06da1e18a41d8ca258e495a2d8c0687..68ccec96894fcd6be24e1a2cb0d70bb622d65e48 100644 (file)
@@ -7118,7 +7118,7 @@ add_syncrepl(
        ConfigArgs *c )
 {
        syncinfo_t *si;
-       int     rc = 0;
+       int i, rc = 0;
 
        if ( !( c->be->be_search && c->be->be_add && c->be->be_modify && c->be->be_delete ) ) {
                snprintf( c->cr_msg, sizeof(c->cr_msg), "database %s does not support "
@@ -7255,13 +7255,17 @@ add_syncrepl(
                        BER_BVISNULL( &si->si_bindconf.sb_uri ) ?
                        "(null)" : si->si_bindconf.sb_uri.bv_val );
                if ( c->be->be_syncinfo ) {
-                       syncinfo_t *sip;
+                       syncinfo_t **sip;
 
                        si->si_cookieState = c->be->be_syncinfo->si_cookieState;
 
-                       /* add new syncrepl to end of list (same order as when deleting) */
-                       for ( sip = c->be->be_syncinfo; sip->si_next; sip = sip->si_next );
-                       sip->si_next = si;
+                       for ( i = 0, sip = &c->be->be_syncinfo;
+                               (*sip)->si_next && ( c->valx < 0 || i < c->valx );
+                               sip = &(*sip)->si_next, i++ )
+                               /* advance to the desired position */ ;
+                       si->si_next = *sip;
+                       *sip = si;
+
                } else {
                        si->si_cookieState = ch_calloc( 1, sizeof( cookie_state ));
                        ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_mutex );
@@ -7270,10 +7274,10 @@ add_syncrepl(
                        ldap_pvt_thread_cond_init( &si->si_cookieState->cs_cond );
 
                        c->be->be_syncinfo = si;
+                       si->si_next = NULL;
                }
                si->si_cookieState->cs_ref++;
 
-               si->si_next = NULL;
                syncrepl_monitor_init();
 
                return 0;
index 8270d13c93d9489bfcffcf05853f8b5ae4201bbc..e10874624e26b4b4d46f77fd564d72307f1bfa5f 100755 (executable)
@@ -302,6 +302,14 @@ olcSyncrepl: {0}rid=001 provider=$URI1 binddn="cn=config"
   bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config"
   $SYNCTYPE retry="3 5 300 5" timeout=3
   suffixmassage="cn=schema,cn=config,cn=consumer"
+# a dummy stanza we add to the beginning and remove again
+olcSyncrepl: {0}rid=006 provider=$URI6 binddn="cn=config"
+  bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config"
+  $SYNCTYPE retry="3 5 300 5" timeout=3
+  suffixmassage="cn=schema,cn=config,cn=consumer"
+-
+delete: olcSyncrepl
+olcSyncrepl: {0}
 -
 add: olcMultiProvider
 olcMultiProvider: TRUE