]> 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>
Wed, 12 Jan 2022 21:59:03 +0000 (21:59 +0000)
servers/slapd/syncrepl.c
tests/scripts/test086-delta-consumer-config

index 077b7815377560c7db6346414213f76248b00dd9..ee82094bd6ddab17949528db2b67f85db4fbf22a 100644 (file)
@@ -7030,7 +7030,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 "
@@ -7167,13 +7167,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 );
@@ -7181,10 +7185,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 def9334e48e8a4e2cfe8d59ad3c917a7f43cc29a..b8f08cf68fa0b8b5de526d68acf9f80167a1b640 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