Blame SOURCES/0001-SYSDB-merge_res_sysdb_attrs-fixed-to-avoid-NULL-ptr-.patch

b833e0
From ff24d1538af88f83d0a3cc2817952cf70e7ca580 Mon Sep 17 00:00:00 2001
b833e0
From: Alexey Tikhonov <atikhono@redhat.com>
b833e0
Date: Sun, 22 Nov 2020 17:44:07 +0100
b833e0
Subject: [PATCH] SYSDB: merge_res_sysdb_attrs() fixed to avoid NULL ptr in
b833e0
 msgs[]
b833e0
MIME-Version: 1.0
b833e0
Content-Type: text/plain; charset=UTF-8
b833e0
Content-Transfer-Encoding: 8bit
b833e0
b833e0
This helps to avoid sssd_be segfaults at be_refresh_get_values_ex() due to NULL
b833e0
ptrs in results of sysdb_search_with_ts_attr()
b833e0
b833e0
Resolves: https://github.com/SSSD/sssd/issues/5412
b833e0
b833e0
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
b833e0
---
b833e0
 src/db/sysdb_search.c | 11 +++++++----
b833e0
 1 file changed, 7 insertions(+), 4 deletions(-)
b833e0
b833e0
diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c
b833e0
index e616fd5bc..4ff65c1ae 100644
b833e0
--- a/src/db/sysdb_search.c
b833e0
+++ b/src/db/sysdb_search.c
b833e0
@@ -221,6 +221,7 @@ static errno_t merge_res_sysdb_attrs(TALLOC_CTX *mem_ctx,
b833e0
                                      const char *attrs[])
b833e0
 {
b833e0
     errno_t ret;
b833e0
+    size_t ts_cache_res_count = 0;
b833e0
     struct ldb_result *ts_cache_res = NULL;
b833e0
 
b833e0
     if (ts_res == NULL || ctx->ldb_ts == NULL) {
b833e0
@@ -231,7 +232,6 @@ static errno_t merge_res_sysdb_attrs(TALLOC_CTX *mem_ctx,
b833e0
     if (ts_cache_res == NULL) {
b833e0
         return ENOMEM;
b833e0
     }
b833e0
-    ts_cache_res->count = ts_res->count;
b833e0
     ts_cache_res->msgs = talloc_zero_array(ts_cache_res,
b833e0
                                            struct ldb_message *,
b833e0
                                            ts_res->count);
b833e0
@@ -244,15 +244,18 @@ static errno_t merge_res_sysdb_attrs(TALLOC_CTX *mem_ctx,
b833e0
         ret = merge_msg_sysdb_attrs(ts_cache_res->msgs,
b833e0
                                     ctx,
b833e0
                                     ts_res->msgs[c],
b833e0
-                                    &ts_cache_res->msgs[c], attrs);
b833e0
-        if (ret != EOK) {
b833e0
+                                    &ts_cache_res->msgs[ts_cache_res_count],
b833e0
+                                    attrs);
b833e0
+        if ((ret != EOK) || (ts_cache_res->msgs[ts_cache_res_count] == NULL)) {
b833e0
             DEBUG(SSSDBG_MINOR_FAILURE,
b833e0
                   "Cannot merge sysdb cache values for %s\n",
b833e0
                   ldb_dn_get_linearized(ts_res->msgs[c]->dn));
b833e0
-            /* non-fatal, we just get only the non-timestamp attrs */
b833e0
+            /* non-fatal, just skip */
b833e0
             continue;
b833e0
         }
b833e0
+        ts_cache_res_count += 1;
b833e0
     }
b833e0
+    ts_cache_res->count = ts_cache_res_count;
b833e0
 
b833e0
     *_ts_cache_res = ts_cache_res;
b833e0
     return EOK;
b833e0
-- 
b833e0
2.21.3
b833e0