Blame SOURCES/0064-overrides-fixes-for-sysdb_invalidate_overrides.patch

9f2ebf
From c0263b48a3512d8b6984693c4b8e772844215f9e Mon Sep 17 00:00:00 2001
9f2ebf
From: Sumit Bose <sbose@redhat.com>
9f2ebf
Date: Mon, 20 Nov 2017 15:51:27 +0100
9f2ebf
Subject: [PATCH 64/67] overrides: fixes for sysdb_invalidate_overrides()
9f2ebf
MIME-Version: 1.0
9f2ebf
Content-Type: text/plain; charset=UTF-8
9f2ebf
Content-Transfer-Encoding: 8bit
9f2ebf
9f2ebf
There were two issues in sysdb_invalidate_overrides().
9f2ebf
9f2ebf
First, SYSDB_CACHE_EXPIRE was only reset for the entry in the data cache
9f2ebf
but not in the timestamp cache.
9f2ebf
9f2ebf
Second, if one of the steps in the combined replace and delete operation
9f2ebf
failed no change was committed to the cache. If, for whatever reasons,
9f2ebf
a user or group object didn't had SYSDB_OVERRIDE_DN set the delete
9f2ebf
failed and hence SYSDB_CACHE_EXPIRE wasn't reset as well. To make sure
9f2ebf
the cache is in a consistent state after a view change the replace and
9f2ebf
the delete operations are don in two steps.
9f2ebf
9f2ebf
Related to https://pagure.io/SSSD/sssd/issue/3579
9f2ebf
9f2ebf
Reviewed-by: Fabiano FidĂȘncio <fidencio@redhat.com>
9f2ebf
(cherry picked from commit 4671acb949c65c5c080532e03b1b6f1c9377a6a5)
9f2ebf
---
9f2ebf
 src/db/sysdb_views.c | 111 +++++++++++++++++++++++++++++++++++++--------------
9f2ebf
 1 file changed, 80 insertions(+), 31 deletions(-)
9f2ebf
9f2ebf
diff --git a/src/db/sysdb_views.c b/src/db/sysdb_views.c
9f2ebf
index afc7852ecf402ef144beca9c1b94fbe3cc4bbb6a..70082d8db9b25c11e8c0823d4e5da2ba0c0d10d1 100644
9f2ebf
--- a/src/db/sysdb_views.c
9f2ebf
+++ b/src/db/sysdb_views.c
9f2ebf
@@ -279,6 +279,45 @@ done:
9f2ebf
     return ret;
9f2ebf
 }
9f2ebf
 
9f2ebf
+static errno_t invalidate_entry_override(struct sysdb_ctx *sysdb,
9f2ebf
+                                         struct ldb_dn *dn,
9f2ebf
+                                         struct ldb_message *msg_del,
9f2ebf
+                                         struct ldb_message *msg_repl)
9f2ebf
+{
9f2ebf
+    int ret;
9f2ebf
+
9f2ebf
+    msg_del->dn = dn;
9f2ebf
+    msg_repl->dn = dn;
9f2ebf
+
9f2ebf
+    ret = ldb_modify(sysdb->ldb, msg_del);
9f2ebf
+    if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
9f2ebf
+        DEBUG(SSSDBG_OP_FAILURE,
9f2ebf
+              "ldb_modify failed: [%s](%d)[%s]\n",
9f2ebf
+              ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
9f2ebf
+        return sysdb_error_to_errno(ret);
9f2ebf
+    }
9f2ebf
+
9f2ebf
+    ret = ldb_modify(sysdb->ldb, msg_repl);
9f2ebf
+    if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
9f2ebf
+        DEBUG(SSSDBG_OP_FAILURE,
9f2ebf
+              "ldb_modify failed: [%s](%d)[%s]\n",
9f2ebf
+              ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
9f2ebf
+        return sysdb_error_to_errno(ret);
9f2ebf
+    }
9f2ebf
+
9f2ebf
+    if (sysdb->ldb_ts != NULL) {
9f2ebf
+        ret = ldb_modify(sysdb->ldb_ts, msg_repl);
9f2ebf
+        if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
9f2ebf
+            DEBUG(SSSDBG_OP_FAILURE,
9f2ebf
+                  "ldb_modify failed: [%s](%d)[%s]\n",
9f2ebf
+                  ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb_ts));
9f2ebf
+            return sysdb_error_to_errno(ret);
9f2ebf
+        }
9f2ebf
+    }
9f2ebf
+
9f2ebf
+    return EOK;
9f2ebf
+}
9f2ebf
+
9f2ebf
 errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
9f2ebf
 {
9f2ebf
     int ret;
9f2ebf
@@ -287,22 +326,23 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
9f2ebf
     bool in_transaction = false;
9f2ebf
     struct ldb_result *res;
9f2ebf
     size_t c;
9f2ebf
-    struct ldb_message *msg;
9f2ebf
+    struct ldb_message *msg_del;
9f2ebf
+    struct ldb_message *msg_repl;
9f2ebf
     struct ldb_dn *base_dn;
9f2ebf
 
9f2ebf
+    if (sysdb->ldb_ts == NULL) {
9f2ebf
+        DEBUG(SSSDBG_CRIT_FAILURE,
9f2ebf
+              "Timestamp cache context not available, cache might not be "
9f2ebf
+              "invalidated completely. Please call 'sss_cache -E' or remove "
9f2ebf
+              "the cache file if there are issues after a view name change.\n");
9f2ebf
+    }
9f2ebf
+
9f2ebf
     tmp_ctx = talloc_new(NULL);
9f2ebf
     if (tmp_ctx == NULL) {
9f2ebf
         DEBUG(SSSDBG_OP_FAILURE, "talloc_new failed.\n");
9f2ebf
         return ENOMEM;
9f2ebf
     }
9f2ebf
 
9f2ebf
-    msg = ldb_msg_new(tmp_ctx);
9f2ebf
-    if (msg == NULL) {
9f2ebf
-        DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_new failed.\n");
9f2ebf
-        ret = ENOMEM;
9f2ebf
-        goto done;
9f2ebf
-    }
9f2ebf
-
9f2ebf
     base_dn = ldb_dn_new(tmp_ctx, sysdb->ldb, SYSDB_BASE);
9f2ebf
     if (base_dn == NULL) {
9f2ebf
         DEBUG(SSSDBG_OP_FAILURE, "ldb_dn_new failed\n");
9f2ebf
@@ -310,27 +350,40 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
9f2ebf
         goto done;
9f2ebf
     }
9f2ebf
 
9f2ebf
-    ret = ldb_msg_add_empty(msg, SYSDB_CACHE_EXPIRE, LDB_FLAG_MOD_REPLACE,
9f2ebf
+    msg_del = ldb_msg_new(tmp_ctx);
9f2ebf
+    if (msg_del == NULL) {
9f2ebf
+        DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_new failed.\n");
9f2ebf
+        ret = ENOMEM;
9f2ebf
+        goto done;
9f2ebf
+    }
9f2ebf
+    ret = ldb_msg_add_empty(msg_del, SYSDB_OVERRIDE_DN, LDB_FLAG_MOD_DELETE,
9f2ebf
                             NULL);
9f2ebf
     if (ret != LDB_SUCCESS) {
9f2ebf
         DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_empty failed.\n");
9f2ebf
         ret = sysdb_error_to_errno(ret);
9f2ebf
         goto done;
9f2ebf
     }
9f2ebf
-    ret = ldb_msg_add_string(msg, SYSDB_CACHE_EXPIRE, "1");
9f2ebf
+
9f2ebf
+    msg_repl = ldb_msg_new(tmp_ctx);
9f2ebf
+    if (msg_repl == NULL) {
9f2ebf
+        DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_new failed.\n");
9f2ebf
+        ret = ENOMEM;
9f2ebf
+        goto done;
9f2ebf
+    }
9f2ebf
+    ret = ldb_msg_add_empty(msg_repl, SYSDB_CACHE_EXPIRE,
9f2ebf
+                            LDB_FLAG_MOD_REPLACE, NULL);
9f2ebf
+    if (ret != LDB_SUCCESS) {
9f2ebf
+        DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_empty failed.\n");
9f2ebf
+        ret = sysdb_error_to_errno(ret);
9f2ebf
+        goto done;
9f2ebf
+    }
9f2ebf
+    ret = ldb_msg_add_string(msg_repl, SYSDB_CACHE_EXPIRE, "1");
9f2ebf
     if (ret != LDB_SUCCESS) {
9f2ebf
         DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_string failed.\n");
9f2ebf
         ret = sysdb_error_to_errno(ret);
9f2ebf
         goto done;
9f2ebf
     }
9f2ebf
 
9f2ebf
-    ret = ldb_msg_add_empty(msg, SYSDB_OVERRIDE_DN, LDB_FLAG_MOD_DELETE, NULL);
9f2ebf
-    if (ret != LDB_SUCCESS) {
9f2ebf
-        DEBUG(SSSDBG_OP_FAILURE, "ldb_msg_add_empty failed.\n");
9f2ebf
-        ret = sysdb_error_to_errno(ret);
9f2ebf
-        goto done;
9f2ebf
-    }
9f2ebf
-
9f2ebf
     ret = sysdb_transaction_start(sysdb);
9f2ebf
     if (ret != EOK) {
9f2ebf
         DEBUG(SSSDBG_OP_FAILURE, "sysdb_transaction_start failed.\n");
9f2ebf
@@ -347,14 +400,12 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
9f2ebf
     }
9f2ebf
 
9f2ebf
     for (c = 0; c < res->count; c++) {
9f2ebf
-        msg->dn = res->msgs[c]->dn;
9f2ebf
-
9f2ebf
-        ret = ldb_modify(sysdb->ldb, msg);
9f2ebf
-        if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
9f2ebf
+        ret = invalidate_entry_override(sysdb, res->msgs[c]->dn, msg_del,
9f2ebf
+                                                                 msg_repl);
9f2ebf
+        if (ret != EOK) {
9f2ebf
             DEBUG(SSSDBG_OP_FAILURE,
9f2ebf
-                  "ldb_modify failed: [%s](%d)[%s]\n",
9f2ebf
-                  ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
9f2ebf
-            ret = sysdb_error_to_errno(ret);
9f2ebf
+                  "invalidate_entry_override failed [%d][%s].\n",
9f2ebf
+                  ret, sss_strerror(ret));
9f2ebf
             goto done;
9f2ebf
         }
9f2ebf
     }
9f2ebf
@@ -370,14 +421,12 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb)
9f2ebf
     }
9f2ebf
 
9f2ebf
     for (c = 0; c < res->count; c++) {
9f2ebf
-        msg->dn = res->msgs[c]->dn;
9f2ebf
-
9f2ebf
-        ret = ldb_modify(sysdb->ldb, msg);
9f2ebf
-        if (ret != LDB_SUCCESS && ret != LDB_ERR_NO_SUCH_ATTRIBUTE) {
9f2ebf
+        ret = invalidate_entry_override(sysdb, res->msgs[c]->dn, msg_del,
9f2ebf
+                                                                 msg_repl);
9f2ebf
+        if (ret != EOK) {
9f2ebf
             DEBUG(SSSDBG_OP_FAILURE,
9f2ebf
-                  "ldb_modify failed: [%s](%d)[%s]\n",
9f2ebf
-                  ldb_strerror(ret), ret, ldb_errstring(sysdb->ldb));
9f2ebf
-            ret = sysdb_error_to_errno(ret);
9f2ebf
+                  "invalidate_entry_override failed [%d][%s].\n",
9f2ebf
+                  ret, sss_strerror(ret));
9f2ebf
             goto done;
9f2ebf
         }
9f2ebf
     }
9f2ebf
-- 
9f2ebf
2.14.3
9f2ebf