Blame SOURCES/0201-cache-Check-for-max_id-min_id-in-cache_req.patch

5e7617
From 7618d442a25a16940f0842d2ad4ae34e60079844 Mon Sep 17 00:00:00 2001
5e7617
From: amitkuma <amitkuma@redhat.com>
5e7617
Date: Thu, 30 Nov 2017 22:18:39 +0530
5e7617
Subject: [PATCH 201/201] cache: Check for max_id/min_id in cache_req
5e7617
MIME-Version: 1.0
5e7617
Content-Type: text/plain; charset=UTF-8
5e7617
Content-Transfer-Encoding: 8bit
5e7617
5e7617
The cache_req code doesn't check the min_id/max_id
5e7617
boundaries for requests by ID.
5e7617
Extending the .lookup_fn function in each plugin
5e7617
that searches by ID for a check that returns non-zero
5e7617
if the entry is out of the range and 0 if not.
5e7617
5e7617
Resolves: https://pagure.io/SSSD/sssd/issue/3569
5e7617
5e7617
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
5e7617
Reviewed-by: Fabiano FidĂȘncio <fidencio@redhat.com>
5e7617
(cherry picked from commit 2af80640f18966d65cf82106059ce3c060df93bf)
5e7617
---
5e7617
 src/responder/common/cache_req/cache_req.c         |  1 +
5e7617
 src/responder/common/cache_req/cache_req_private.h |  2 +
5e7617
 src/responder/common/cache_req/cache_req_search.c  |  5 ++
5e7617
 .../common/cache_req/plugins/cache_req_common.c    | 11 +++
5e7617
 .../cache_req/plugins/cache_req_group_by_id.c      |  6 ++
5e7617
 .../cache_req/plugins/cache_req_object_by_id.c     |  6 ++
5e7617
 .../cache_req/plugins/cache_req_user_by_id.c       |  5 ++
5e7617
 src/tests/cmocka/test_responder_cache_req.c        | 81 +++++++++++++++++++++-
5e7617
 src/util/util_errors.c                             |  1 +
5e7617
 src/util/util_errors.h                             |  1 +
5e7617
 10 files changed, 117 insertions(+), 2 deletions(-)
5e7617
5e7617
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
5e7617
index 83eab8ed2de0b5c7d25306d853aadc9b53cb4842..3ebf64af24bb9a2a67165dd17d27fd25fc7915c2 100644
5e7617
--- a/src/responder/common/cache_req/cache_req.c
5e7617
+++ b/src/responder/common/cache_req/cache_req.c
5e7617
@@ -574,6 +574,7 @@ static void cache_req_search_domains_done(struct tevent_req *subreq)
5e7617
         }
5e7617
 
5e7617
         break;
5e7617
+    case ERR_ID_OUTSIDE_RANGE:
5e7617
     case ENOENT:
5e7617
         if (state->check_next == false) {
5e7617
             /* Not found. */
5e7617
diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h
5e7617
index c0ee5f969f2a171b8a6eb396b3d14b593d157b76..5b79d9429bc29c47c28e0b5a6367a6e7035ca1c3 100644
5e7617
--- a/src/responder/common/cache_req/cache_req_private.h
5e7617
+++ b/src/responder/common/cache_req/cache_req_private.h
5e7617
@@ -165,4 +165,6 @@ bool
5e7617
 cache_req_common_dp_recv(struct tevent_req *subreq,
5e7617
                          struct cache_req *cr);
5e7617
 
5e7617
+errno_t cache_req_idminmax_check(struct cache_req_data *data,
5e7617
+                                 struct sss_domain_info *domain);
5e7617
 #endif /* _CACHE_REQ_PRIVATE_H_ */
5e7617
diff --git a/src/responder/common/cache_req/cache_req_search.c b/src/responder/common/cache_req/cache_req_search.c
5e7617
index 56d0345cd8f98de574961d3c9628ae7a4c24f9be..ba25dcf578ef80aa8597bccb41da839d7bd146b3 100644
5e7617
--- a/src/responder/common/cache_req/cache_req_search.c
5e7617
+++ b/src/responder/common/cache_req/cache_req_search.c
5e7617
@@ -197,6 +197,11 @@ static errno_t cache_req_search_cache(TALLOC_CTX *mem_ctx,
5e7617
 
5e7617
         *_result = result;
5e7617
         break;
5e7617
+    case ERR_ID_OUTSIDE_RANGE:
5e7617
+        CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr,
5e7617
+                        "ID [%s] was filtered out\n",
5e7617
+                        cr->debugobj);
5e7617
+        break;
5e7617
     case ENOENT:
5e7617
         CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr,
5e7617
                         "Object [%s] was not found in cache\n",
5e7617
diff --git a/src/responder/common/cache_req/plugins/cache_req_common.c b/src/responder/common/cache_req/plugins/cache_req_common.c
5e7617
index b80f310feeebbdbc824db441ff5313632585d3fb..d7c6ab2eac412042f90d491eb8428116156f512b 100644
5e7617
--- a/src/responder/common/cache_req/plugins/cache_req_common.c
5e7617
+++ b/src/responder/common/cache_req/plugins/cache_req_common.c
5e7617
@@ -26,6 +26,17 @@
5e7617
 #include "providers/data_provider.h"
5e7617
 #include "responder/common/cache_req/cache_req_plugin.h"
5e7617
 
5e7617
+errno_t cache_req_idminmax_check(struct cache_req_data *data,
5e7617
+	                         struct sss_domain_info *domain)
5e7617
+{
5e7617
+   if (((domain->id_min != 0) && (data->id < domain->id_min)) ||
5e7617
+       ((domain->id_max != 0) && (data->id > domain->id_max))) {
5e7617
+        DEBUG(SSSDBG_FUNC_DATA, "id exceeds min/max boundaries\n");
5e7617
+        return ERR_ID_OUTSIDE_RANGE;
5e7617
+   }
5e7617
+   return EOK;
5e7617
+}
5e7617
+
5e7617
 static struct ldb_message *
5e7617
 cache_req_well_known_sid_msg(TALLOC_CTX *mem_ctx,
5e7617
                              const char *sid,
5e7617
diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
5e7617
index 121f95abe86d2466aaea69f0fe68dfb33b1fee9e..04e085456f38e154a04ce0a803f2ba22830c1827 100644
5e7617
--- a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
5e7617
+++ b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c
5e7617
@@ -64,6 +64,12 @@ cache_req_group_by_id_lookup(TALLOC_CTX *mem_ctx,
5e7617
                              struct sss_domain_info *domain,
5e7617
                              struct ldb_result **_result)
5e7617
 {
5e7617
+    errno_t ret;
5e7617
+
5e7617
+    ret = cache_req_idminmax_check(data, domain);
5e7617
+    if (ret != EOK) {
5e7617
+	return ret;
5e7617
+    }
5e7617
     return sysdb_getgrgid_with_views(mem_ctx, domain, data->id, _result);
5e7617
 }
5e7617
 
5e7617
diff --git a/src/responder/common/cache_req/plugins/cache_req_object_by_id.c b/src/responder/common/cache_req/plugins/cache_req_object_by_id.c
5e7617
index 4c88e1035b41969703c1c38d740e15516ac0d622..50c149e8795a61307e445d4c063dc0df1166519c 100644
5e7617
--- a/src/responder/common/cache_req/plugins/cache_req_object_by_id.c
5e7617
+++ b/src/responder/common/cache_req/plugins/cache_req_object_by_id.c
5e7617
@@ -90,6 +90,12 @@ cache_req_object_by_id_lookup(TALLOC_CTX *mem_ctx,
5e7617
                               struct sss_domain_info *domain,
5e7617
                               struct ldb_result **_result)
5e7617
 {
5e7617
+    errno_t ret;
5e7617
+
5e7617
+    ret = cache_req_idminmax_check(data, domain);
5e7617
+    if (ret != EOK) {
5e7617
+        return ret;
5e7617
+    }
5e7617
     return sysdb_search_object_by_id(mem_ctx, domain, data->id,
5e7617
                                      data->attrs, _result);
5e7617
 }
5e7617
diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
5e7617
index 3c25c7631b3da4a829ab577629334a7ee97980da..05add9564f57655bb53520b848971286bba6cab5 100644
5e7617
--- a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
5e7617
+++ b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c
5e7617
@@ -64,6 +64,11 @@ cache_req_user_by_id_lookup(TALLOC_CTX *mem_ctx,
5e7617
                             struct sss_domain_info *domain,
5e7617
                             struct ldb_result **_result)
5e7617
 {
5e7617
+    errno_t ret;
5e7617
+    ret = cache_req_idminmax_check(data, domain);
5e7617
+    if (ret != EOK) {
5e7617
+        return ret;
5e7617
+    }
5e7617
     return sysdb_getpwuid_with_views(mem_ctx, domain, data->id, _result);
5e7617
 }
5e7617
 
5e7617
diff --git a/src/tests/cmocka/test_responder_cache_req.c b/src/tests/cmocka/test_responder_cache_req.c
5e7617
index 80086232fd437876c2b190fb972c2ee3194d9efd..82ba4125265d0bacd44a9f0082d588eef673a6f0 100644
5e7617
--- a/src/tests/cmocka/test_responder_cache_req.c
5e7617
+++ b/src/tests/cmocka/test_responder_cache_req.c
5e7617
@@ -58,6 +58,11 @@ struct test_group {
5e7617
                                     test_single_domain_setup, \
5e7617
                                     test_single_domain_teardown)
5e7617
 
5e7617
+#define new_single_domain_id_limit_test(test) \
5e7617
+    cmocka_unit_test_setup_teardown(test_ ## test, \
5e7617
+                                    test_single_domain_id_limits_setup, \
5e7617
+                                    test_single_domain_teardown)
5e7617
+
5e7617
 #define new_multi_domain_test(test) \
5e7617
     cmocka_unit_test_setup_teardown(test_ ## test, \
5e7617
                                     test_multi_domain_setup, \
5e7617
@@ -451,7 +456,8 @@ __wrap_sss_dp_get_account_send(TALLOC_CTX *mem_ctx,
5e7617
     return test_req_succeed_send(mem_ctx, rctx->ev);
5e7617
 }
5e7617
 
5e7617
-static int test_single_domain_setup(void **state)
5e7617
+static int test_single_domain_setup_common(void **state,
5e7617
+                                           struct sss_test_conf_param *params)
5e7617
 {
5e7617
     struct cache_req_test_ctx *test_ctx = NULL;
5e7617
     errno_t ret;
5e7617
@@ -465,7 +471,7 @@ static int test_single_domain_setup(void **state)
5e7617
     *state = test_ctx;
5e7617
 
5e7617
     test_ctx->tctx = create_dom_test_ctx(test_ctx, TESTS_PATH, TEST_CONF_DB,
5e7617
-                                         TEST_DOM_NAME, TEST_ID_PROVIDER, NULL);
5e7617
+                                         TEST_DOM_NAME, TEST_ID_PROVIDER, params);
5e7617
     assert_non_null(test_ctx->tctx);
5e7617
 
5e7617
     test_ctx->rctx = mock_rctx(test_ctx, test_ctx->tctx->ev,
5e7617
@@ -480,6 +486,11 @@ static int test_single_domain_setup(void **state)
5e7617
     return 0;
5e7617
 }
5e7617
 
5e7617
+static int test_single_domain_setup(void **state)
5e7617
+{
5e7617
+    return test_single_domain_setup_common(state, NULL);
5e7617
+}
5e7617
+
5e7617
 static int test_single_domain_teardown(void **state)
5e7617
 {
5e7617
     struct cache_req_test_ctx *test_ctx;
5e7617
@@ -495,6 +506,16 @@ static int test_single_domain_teardown(void **state)
5e7617
     return 0;
5e7617
 }
5e7617
 
5e7617
+static int test_single_domain_id_limits_setup(void **state)
5e7617
+{
5e7617
+    struct sss_test_conf_param params[] = {
5e7617
+        { "min_id", "100" },
5e7617
+        { "max_id", "10000" },
5e7617
+        { NULL, NULL },             /* Sentinel */
5e7617
+    };
5e7617
+    return test_single_domain_setup_common(state, params);
5e7617
+}
5e7617
+
5e7617
 static int test_multi_domain_setup(void **state)
5e7617
 {
5e7617
     struct cache_req_test_ctx *test_ctx = NULL;
5e7617
@@ -526,6 +547,32 @@ static int test_multi_domain_setup(void **state)
5e7617
     return 0;
5e7617
 }
5e7617
 
5e7617
+void test_user_by_id_below_id_range(void **state)
5e7617
+{
5e7617
+    struct cache_req_test_ctx *test_ctx = NULL;
5e7617
+
5e7617
+    test_ctx = talloc_get_type_abort(*state, struct cache_req_test_ctx);
5e7617
+
5e7617
+    /* Test. */
5e7617
+    run_cache_req(test_ctx, cache_req_user_by_id_send,
5e7617
+                  cache_req_user_by_id_test_done, test_ctx->tctx->dom,
5e7617
+                  0, 10, ENOENT);
5e7617
+    assert_false(test_ctx->dp_called);
5e7617
+}
5e7617
+
5e7617
+void test_user_by_id_above_id_range(void **state)
5e7617
+{
5e7617
+    struct cache_req_test_ctx *test_ctx = NULL;
5e7617
+
5e7617
+    test_ctx = talloc_get_type_abort(*state, struct cache_req_test_ctx);
5e7617
+
5e7617
+    /* Test. */
5e7617
+    run_cache_req(test_ctx, cache_req_user_by_id_send,
5e7617
+                  cache_req_user_by_id_test_done, test_ctx->tctx->dom,
5e7617
+                  0, 100000, ENOENT);
5e7617
+    assert_false(test_ctx->dp_called);
5e7617
+}
5e7617
+
5e7617
 static int test_multi_domain_teardown(void **state)
5e7617
 {
5e7617
     struct cache_req_test_ctx *test_ctx;
5e7617
@@ -1084,6 +1131,32 @@ void test_group_by_name_multiple_domains_found(void **state)
5e7617
     check_group(test_ctx, &groups[0], domain);
5e7617
 }
5e7617
 
5e7617
+void test_group_by_id_below_id_range(void **state)
5e7617
+{
5e7617
+    struct cache_req_test_ctx *test_ctx = NULL;
5e7617
+
5e7617
+    test_ctx = talloc_get_type_abort(*state, struct cache_req_test_ctx);
5e7617
+
5e7617
+    /* Test. */
5e7617
+    run_cache_req(test_ctx, cache_req_group_by_id_send,
5e7617
+                  cache_req_group_by_id_test_done, test_ctx->tctx->dom,
5e7617
+                  0, 10, ENOENT);
5e7617
+    assert_false(test_ctx->dp_called);
5e7617
+}
5e7617
+
5e7617
+void test_group_by_id_above_id_range(void **state)
5e7617
+{
5e7617
+    struct cache_req_test_ctx *test_ctx = NULL;
5e7617
+
5e7617
+    test_ctx = talloc_get_type_abort(*state, struct cache_req_test_ctx);
5e7617
+
5e7617
+    /* Test. */
5e7617
+    run_cache_req(test_ctx, cache_req_group_by_id_send,
5e7617
+                  cache_req_group_by_id_test_done, test_ctx->tctx->dom,
5e7617
+                  0, 100000, ENOENT);
5e7617
+    assert_false(test_ctx->dp_called);
5e7617
+}
5e7617
+
5e7617
 void test_group_by_name_multiple_domains_notfound(void **state)
5e7617
 {
5e7617
     struct cache_req_test_ctx *test_ctx = NULL;
5e7617
@@ -2170,6 +2243,8 @@ int main(int argc, const char *argv[])
5e7617
         new_single_domain_test(user_by_id_missing_notfound),
5e7617
         new_multi_domain_test(user_by_id_multiple_domains_found),
5e7617
         new_multi_domain_test(user_by_id_multiple_domains_notfound),
5e7617
+        new_single_domain_id_limit_test(user_by_id_below_id_range),
5e7617
+        new_single_domain_id_limit_test(user_by_id_above_id_range),
5e7617
 
5e7617
         new_single_domain_test(group_by_name_cache_valid),
5e7617
         new_single_domain_test(group_by_name_cache_expired),
5e7617
@@ -2180,6 +2255,8 @@ int main(int argc, const char *argv[])
5e7617
         new_multi_domain_test(group_by_name_multiple_domains_found),
5e7617
         new_multi_domain_test(group_by_name_multiple_domains_notfound),
5e7617
         new_multi_domain_test(group_by_name_multiple_domains_parse),
5e7617
+        new_single_domain_id_limit_test(group_by_id_below_id_range),
5e7617
+        new_single_domain_id_limit_test(group_by_id_above_id_range),
5e7617
 
5e7617
         new_single_domain_test(group_by_id_cache_valid),
5e7617
         new_single_domain_test(group_by_id_cache_expired),
5e7617
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
5e7617
index 97eaf160f20bcc8cfe52254070a2d182e19addd4..9f6e413f0414f38dee4f0ee6b5f3fbeaac5d6612 100644
5e7617
--- a/src/util/util_errors.c
5e7617
+++ b/src/util/util_errors.c
5e7617
@@ -116,6 +116,7 @@ struct err_string error_to_str[] = {
5e7617
     { "Unable to initialize SSL" }, /* ERR_SSL_FAILURE */
5e7617
     { "Unable to verify peer" }, /* ERR_UNABLE_TO_VERIFY_PEER */
5e7617
     { "Unable to resolve host" }, /* ERR_UNABLE_TO_RESOLVE_HOST */
5e7617
+    { "ID is outside the allowed range" }, /* ERR_ID_OUTSIDE_RANGE */
5e7617
     { "ERR_LAST" } /* ERR_LAST */
5e7617
 };
5e7617
 
5e7617
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
5e7617
index 4a250bf0339ba689680c155fa8e6d43f42c2467e..051111ea7c249a5d8e4f302022898648ba2ffdd2 100644
5e7617
--- a/src/util/util_errors.h
5e7617
+++ b/src/util/util_errors.h
5e7617
@@ -138,6 +138,7 @@ enum sssd_errors {
5e7617
     ERR_SSL_FAILURE,
5e7617
     ERR_UNABLE_TO_VERIFY_PEER,
5e7617
     ERR_UNABLE_TO_RESOLVE_HOST,
5e7617
+    ERR_ID_OUTSIDE_RANGE,
5e7617
     ERR_LAST            /* ALWAYS LAST */
5e7617
 };
5e7617
 
5e7617
-- 
5e7617
2.14.3
5e7617