Blame SOURCES/0003-Ticket-49180-errors-log-filled-with-attrlist_replace.patch

b045b9
From 62fbb3423b26426e735e134134ab710945514ca6 Mon Sep 17 00:00:00 2001
b69e47
From: Ludwig Krispenz <lkrispen@redhat.com>
b045b9
Date: Tue, 26 Sep 2017 15:51:41 +0200
b045b9
Subject: [PATCH] Ticket: 49180 - errors log filled with attrlist_replace -
b045b9
 attr_replace
b69e47
b045b9
Bug: If a RUV contains the same URL with different replica IDs the created referrals contain duplicates
b69e47
b045b9
Fix: check duplicate referrals
b69e47
b045b9
Reviewed by: Mark, thanks
b69e47
---
b69e47
 ldap/servers/plugins/replication/repl5_ruv.c | 13 ++++++++++++-
b69e47
 1 file changed, 12 insertions(+), 1 deletion(-)
b69e47
b69e47
diff --git a/ldap/servers/plugins/replication/repl5_ruv.c b/ldap/servers/plugins/replication/repl5_ruv.c
b045b9
index 40dc0928b..7bfdc3425 100644
b69e47
--- a/ldap/servers/plugins/replication/repl5_ruv.c
b69e47
+++ b/ldap/servers/plugins/replication/repl5_ruv.c
b045b9
@@ -1386,7 +1386,17 @@ ruv_replica_count(const RUV *ruv)
b69e47
  * Extract all the referral URL's from the RUV (but self URL),
b69e47
  * returning them in an array of strings, that
b69e47
  * the caller must free.
b69e47
+ * We also check and remove duplicates (caused by unclean RUVs)
b69e47
  */
b69e47
+static int
b69e47
+ruv_referral_exists(unsigned char *purl, char **refs, int count)
b69e47
+{
b69e47
+    for (size_t j=0; j
b69e47
+        if (0 == slapi_utf8casecmp(purl, (unsigned char *)refs[j]))
b69e47
+            return 1;
b69e47
+    }
b69e47
+    return 0;
b69e47
+}
b69e47
 char **
b69e47
 ruv_get_referrals(const RUV *ruv)
b69e47
 {
b045b9
@@ -1407,7 +1417,8 @@ ruv_get_referrals(const RUV *ruv)
b045b9
             /* Add URL into referrals if doesn't match self URL */
b045b9
             if ((replica->replica_purl != NULL) &&
b045b9
                 (slapi_utf8casecmp((unsigned char *)replica->replica_purl,
b045b9
-                                   (unsigned char *)mypurl) != 0)) {
b69e47
+                                   (unsigned char *)mypurl) != 0) &&
b045b9
+                !ruv_referral_exists((unsigned char *)replica->replica_purl, r, i)) {
b045b9
                 r[i] = slapi_ch_strdup(replica->replica_purl);
b045b9
                 i++;
b045b9
             }
b69e47
-- 
b045b9
2.13.6
b69e47