dsdb: Improve missing objectClass handling
authorAndrew Bartlett <abartlet@samba.org>
Tue, 25 Mar 2014 23:46:57 +0000 (12:46 +1300)
committerKarolin Seeger <kseeger@samba.org>
Tue, 15 Jul 2014 10:46:15 +0000 (12:46 +0200)
This attempts to permit deletion of objects that have no objectClass
to allow dbcheck to clean up a corrupt database.  It is not complete,
the replmd_replPropertyMetaDataCtr1_sort_and_verify() call will still
fail, but this is as much as is safe to do without a way to replicate
the original issue.

Andrew Bartlett

Change-Id: If0b6c7f18e8aee587e6b3b4af878a0145f5eac37
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
(cherry picked from commit 74a83be540c8fa0dd0f91da25b1f9d7ccc4ec568)

source4/dsdb/samdb/ldb_modules/repl_meta_data.c

index 18c6f0372186e83da19f1f82d162a185d02eb595..b01c956d1c3249e1ac9fe19f4c2f212cde101916 100644 (file)
@@ -1523,19 +1523,19 @@ static int replmd_update_rpmd(struct ldb_module *module,
         * corruption if we don't have this!
         */
        objectclass_el = ldb_msg_find_element(res->msgs[0], "objectClass");
-       if (objectclass_el == NULL) {
-               ldb_debug_set(ldb, LDB_DEBUG_FATAL,
-                             __location__ ": objectClass missing on %s\n",
-                             ldb_dn_get_linearized(msg->dn));
-               return LDB_ERR_OPERATIONS_ERROR;
-       }
-
-       /*
-        * Now check if this objectClass means we need to do urgent replication
-        */
-       if (!*is_urgent && replmd_check_urgent_objectclass(objectclass_el,
-                                                          situation)) {
-               *is_urgent = true;
+       if (objectclass_el != NULL) {
+               /*
+                * Now check if this objectClass means we need to do urgent replication
+                */
+               if (!*is_urgent && replmd_check_urgent_objectclass(objectclass_el,
+                                                                  situation)) {
+                       *is_urgent = true;
+               }
+       } else if (!ldb_request_get_control(req, DSDB_CONTROL_DBCHECK)) {
+               ldb_asprintf_errstring(ldb, __location__
+                                      ": objectClass missing on %s\n",
+                                      ldb_dn_get_linearized(msg->dn));
+               return LDB_ERR_OBJECT_CLASS_VIOLATION;
        }
 
        /*