[PATCH] Issue 4711 - SIGSEV with sync_repl (#4738)
authortbordaz <tbordaz@redhat.com>
Tue, 27 Apr 2021 07:29:32 +0000 (09:29 +0200)
committerTimo Aaltonen <tjaalton@debian.org>
Wed, 19 May 2021 11:22:15 +0000 (12:22 +0100)
Bug description:
sync_repl sends back entries identified with a unique
identifier that is 'nsuniqueid'. If 'nsuniqueid' is
missing, then it may crash

Fix description:
Check a nsuniqueid is available else returns OP_ERR

relates: https://github.com/389ds/389-ds-base/issues/4711

Reviewed by: Pierre Rogier, James Chapman, William Brown (Thanks!)

Platforms tested:  F33

Gbp-Pq: Name 4711-SIGSEV-with-sync_repl-4738.patch

ldap/servers/plugins/sync/sync_util.c

index dc7f49faccecd88da016cb997878d628121b142c..d84705a41ae32e38502c32662a42e9d08ba8946e 100644 (file)
@@ -165,8 +165,8 @@ sync_create_state_control(Slapi_Entry *e, LDAPControl **ctrlp, int type, Sync_Co
     BerElement *ber;
     struct berval *bvp;
     char *uuid;
-    Slapi_Attr *attr;
-    Slapi_Value *val;
+    Slapi_Attr *attr = NULL;
+    Slapi_Value *val = NULL;
 
     if (type == LDAP_SYNC_NONE || ctrlp == NULL || (ber = der_alloc()) == NULL) {
         return (LDAP_OPERATIONS_ERROR);
@@ -191,6 +191,14 @@ sync_create_state_control(Slapi_Entry *e, LDAPControl **ctrlp, int type, Sync_Co
     } else {
         slapi_entry_attr_find(e, SLAPI_ATTR_UNIQUEID, &attr);
         slapi_attr_first_value(attr, &val);
+        if ((attr == NULL) || (val == NULL)) {
+            /* It may happen with entries in special backends
+             * such like cn=config, cn=shema, cn=monitor...
+             */
+            slapi_log_err(SLAPI_LOG_ERR, SYNC_PLUGIN_SUBSYSTEM,
+                          "sync_create_state_control - Entries are missing nsuniqueid. Unable to proceed.\n");
+            return (LDAP_OPERATIONS_ERROR);
+        }
         uuid = sync_nsuniqueid2uuid(slapi_value_get_string(val));
     }