Blame SOURCES/0035-simple-fix-memory-leak-while-reloading-lists.patch

b833e0
From 19c2c641e669ee1c08d6706c132625dc30e64609 Mon Sep 17 00:00:00 2001
b833e0
From: Sumit Bose <sbose@redhat.com>
b833e0
Date: Tue, 12 Jan 2021 16:40:56 +0100
b833e0
Subject: [PATCH] simple: fix memory leak while reloading lists
b833e0
b833e0
The simple access provider will reload the access and deny lists at
b833e0
runtime to make sure that users and groups from domains which are
b833e0
discovered at runtime are properly processed.
b833e0
b833e0
While reloading the lists the original lists are not freed and an
b833e0
intermediate list wasn't removed as well.
b833e0
b833e0
Resolves: https://github.com/SSSD/sssd/issues/5456
b833e0
b833e0
:fixes: Memory leak in the simple access provider
b833e0
b833e0
Reviewed-by: Alexey Tikhonov <atikhono@redhat.com>
b833e0
---
b833e0
 src/providers/simple/simple_access.c | 28 +++++++++++++++++++++-------
b833e0
 1 file changed, 21 insertions(+), 7 deletions(-)
b833e0
b833e0
diff --git a/src/providers/simple/simple_access.c b/src/providers/simple/simple_access.c
b833e0
index 1868569b1..49226adf2 100644
b833e0
--- a/src/providers/simple/simple_access.c
b833e0
+++ b/src/providers/simple/simple_access.c
b833e0
@@ -117,17 +117,13 @@ int simple_access_obtain_filter_lists(struct simple_ctx *ctx)
b833e0
         const char *name;
b833e0
         const char *option;
b833e0
         char **orig_list;
b833e0
-        char ***ctx_list;
b833e0
+        char **ctx_list;
b833e0
     } lists[] = {{"Allow users", CONFDB_SIMPLE_ALLOW_USERS, NULL, NULL},
b833e0
                  {"Deny users", CONFDB_SIMPLE_DENY_USERS, NULL, NULL},
b833e0
                  {"Allow groups", CONFDB_SIMPLE_ALLOW_GROUPS, NULL, NULL},
b833e0
                  {"Deny groups", CONFDB_SIMPLE_DENY_GROUPS, NULL, NULL},
b833e0
                  {NULL, NULL, NULL, NULL}};
b833e0
 
b833e0
-    lists[0].ctx_list = &ctx->allow_users;
b833e0
-    lists[1].ctx_list = &ctx->deny_users;
b833e0
-    lists[2].ctx_list = &ctx->allow_groups;
b833e0
-    lists[3].ctx_list = &ctx->deny_groups;
b833e0
 
b833e0
     ret = sysdb_master_domain_update(bectx->domain);
b833e0
     if (ret != EOK) {
b833e0
@@ -141,7 +137,6 @@ int simple_access_obtain_filter_lists(struct simple_ctx *ctx)
b833e0
                                         lists[i].option, &lists[i].orig_list);
b833e0
         if (ret == ENOENT) {
b833e0
             DEBUG(SSSDBG_FUNC_DATA, "%s list is empty.\n", lists[i].name);
b833e0
-            *lists[i].ctx_list = NULL;
b833e0
             continue;
b833e0
         } else if (ret != EOK) {
b833e0
             DEBUG(SSSDBG_CRIT_FAILURE, "confdb_get_string_as_list failed.\n");
b833e0
@@ -149,7 +144,8 @@ int simple_access_obtain_filter_lists(struct simple_ctx *ctx)
b833e0
         }
b833e0
 
b833e0
         ret = simple_access_parse_names(ctx, bectx, lists[i].orig_list,
b833e0
-                                        lists[i].ctx_list);
b833e0
+                                        &lists[i].ctx_list);
b833e0
+        talloc_free(lists[i].orig_list);
b833e0
         if (ret != EOK) {
b833e0
             DEBUG(SSSDBG_CRIT_FAILURE, "Unable to parse %s list [%d]: %s\n",
b833e0
                                         lists[i].name, ret, sss_strerror(ret));
b833e0
@@ -157,6 +153,18 @@ int simple_access_obtain_filter_lists(struct simple_ctx *ctx)
b833e0
         }
b833e0
     }
b833e0
 
b833e0
+    talloc_free(ctx->allow_users);
b833e0
+    ctx->allow_users = talloc_steal(ctx, lists[0].ctx_list);
b833e0
+
b833e0
+    talloc_free(ctx->deny_users);
b833e0
+    ctx->deny_users = talloc_steal(ctx, lists[1].ctx_list);
b833e0
+
b833e0
+    talloc_free(ctx->allow_groups);
b833e0
+    ctx->allow_groups = talloc_steal(ctx, lists[2].ctx_list);
b833e0
+
b833e0
+    talloc_free(ctx->deny_groups);
b833e0
+    ctx->deny_groups = talloc_steal(ctx, lists[3].ctx_list);
b833e0
+
b833e0
     if (!ctx->allow_users &&
b833e0
             !ctx->allow_groups &&
b833e0
             !ctx->deny_users &&
b833e0
@@ -165,9 +173,15 @@ int simple_access_obtain_filter_lists(struct simple_ctx *ctx)
b833e0
               "No rules supplied for simple access provider. "
b833e0
                "Access will be granted for all users.\n");
b833e0
     }
b833e0
+
b833e0
+
b833e0
     return EOK;
b833e0
 
b833e0
 failed:
b833e0
+    for (i = 0; lists[i].name != NULL; i++) {
b833e0
+        talloc_free(lists[i].ctx_list);
b833e0
+    }
b833e0
+
b833e0
     return ret;
b833e0
 }
b833e0
 
b833e0
-- 
b833e0
2.21.3
b833e0