Blame SOURCES/0049-nss-use-enumeration-context-as-talloc-parent-for-cac.patch

0048be
From 720a423a0119f23606c6029c3f48be98841ca910 Mon Sep 17 00:00:00 2001
0048be
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
0048be
Date: Tue, 30 Oct 2018 13:21:28 +0100
0048be
Subject: [PATCH] nss: use enumeration context as talloc parent for cache req
0048be
 result
0048be
0048be
Otherwise we end up with memory leak since the result is never freed.
0048be
0048be
We need to convert nctx->*ent structures into talloc pointer so
0048be
we can use enum_ctx as parent.
0048be
0048be
Resolves:
0048be
https://pagure.io/SSSD/sssd/issue/3870
0048be
0048be
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
0048be
(cherry picked from commit 406b731ddfbeb62623640cc37a7adc76af0a4b22)
0048be
---
0048be
 src/responder/nss/nss_cmd.c     | 12 ++++++------
0048be
 src/responder/nss/nss_enum.c    |  2 +-
0048be
 src/responder/nss/nss_private.h |  6 +++---
0048be
 src/responder/nss/nsssrv.c      | 21 +++++++++++++++++++++
0048be
 4 files changed, 31 insertions(+), 10 deletions(-)
0048be
0048be
diff --git a/src/responder/nss/nss_cmd.c b/src/responder/nss/nss_cmd.c
0048be
index 9ee6ca805..25e663ed5 100644
0048be
--- a/src/responder/nss/nss_cmd.c
0048be
+++ b/src/responder/nss/nss_cmd.c
0048be
@@ -942,7 +942,7 @@ static errno_t nss_cmd_setpwent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     nss_ctx = talloc_get_type(cli_ctx->rctx->pvt_ctx, struct nss_ctx);
0048be
 
0048be
-    return nss_setent(cli_ctx, CACHE_REQ_ENUM_USERS, &nss_ctx->pwent);
0048be
+    return nss_setent(cli_ctx, CACHE_REQ_ENUM_USERS, nss_ctx->pwent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_getpwent(struct cli_ctx *cli_ctx)
0048be
@@ -955,7 +955,7 @@ static errno_t nss_cmd_getpwent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     return nss_getent(cli_ctx, CACHE_REQ_ENUM_USERS,
0048be
                       &state_ctx->pwent, nss_protocol_fill_pwent,
0048be
-                      &nss_ctx->pwent);
0048be
+                      nss_ctx->pwent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_endpwent(struct cli_ctx *cli_ctx)
0048be
@@ -998,7 +998,7 @@ static errno_t nss_cmd_setgrent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     nss_ctx = talloc_get_type(cli_ctx->rctx->pvt_ctx, struct nss_ctx);
0048be
 
0048be
-    return nss_setent(cli_ctx, CACHE_REQ_ENUM_GROUPS, &nss_ctx->grent);
0048be
+    return nss_setent(cli_ctx, CACHE_REQ_ENUM_GROUPS, nss_ctx->grent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_getgrent(struct cli_ctx *cli_ctx)
0048be
@@ -1011,7 +1011,7 @@ static errno_t nss_cmd_getgrent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     return nss_getent(cli_ctx, CACHE_REQ_ENUM_GROUPS,
0048be
                       &state_ctx->grent, nss_protocol_fill_grent,
0048be
-                      &nss_ctx->grent);
0048be
+                      nss_ctx->grent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_endgrent(struct cli_ctx *cli_ctx)
0048be
@@ -1093,7 +1093,7 @@ static errno_t nss_cmd_setservent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     nss_ctx = talloc_get_type(cli_ctx->rctx->pvt_ctx, struct nss_ctx);
0048be
 
0048be
-    return nss_setent(cli_ctx, CACHE_REQ_ENUM_SVC, &nss_ctx->svcent);
0048be
+    return nss_setent(cli_ctx, CACHE_REQ_ENUM_SVC, nss_ctx->svcent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_getservent(struct cli_ctx *cli_ctx)
0048be
@@ -1106,7 +1106,7 @@ static errno_t nss_cmd_getservent(struct cli_ctx *cli_ctx)
0048be
 
0048be
     return nss_getent(cli_ctx, CACHE_REQ_ENUM_SVC,
0048be
                       &state_ctx->svcent, nss_protocol_fill_svcent,
0048be
-                      &nss_ctx->svcent);
0048be
+                      nss_ctx->svcent);
0048be
 }
0048be
 
0048be
 static errno_t nss_cmd_endservent(struct cli_ctx *cli_ctx)
0048be
diff --git a/src/responder/nss/nss_enum.c b/src/responder/nss/nss_enum.c
0048be
index a45b65233..9588943c9 100644
0048be
--- a/src/responder/nss/nss_enum.c
0048be
+++ b/src/responder/nss/nss_enum.c
0048be
@@ -138,7 +138,7 @@ static void nss_setent_internal_done(struct tevent_req *subreq)
0048be
     switch (ret) {
0048be
     case EOK:
0048be
         talloc_zfree(state->enum_ctx->result);
0048be
-        state->enum_ctx->result = talloc_steal(state->nss_ctx, result);
0048be
+        state->enum_ctx->result = talloc_steal(state->enum_ctx, result);
0048be
 
0048be
         if (state->type == CACHE_REQ_NETGROUP_BY_NAME) {
0048be
             /* We need to expand the netgroup into triples and members. */
0048be
diff --git a/src/responder/nss/nss_private.h b/src/responder/nss/nss_private.h
0048be
index aa8d8e9cd..cd0d35517 100644
0048be
--- a/src/responder/nss/nss_private.h
0048be
+++ b/src/responder/nss/nss_private.h
0048be
@@ -78,9 +78,9 @@ struct nss_ctx {
0048be
     const char **extra_attributes;
0048be
 
0048be
     /* Enumeration. */
0048be
-    struct nss_enum_ctx pwent;
0048be
-    struct nss_enum_ctx grent;
0048be
-    struct nss_enum_ctx svcent;
0048be
+    struct nss_enum_ctx *pwent;
0048be
+    struct nss_enum_ctx *grent;
0048be
+    struct nss_enum_ctx *svcent;
0048be
     hash_table_t *netgrent;
0048be
 
0048be
     /* Memory cache. */
0048be
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
0048be
index 004e6c1a1..d6c5a08a9 100644
0048be
--- a/src/responder/nss/nsssrv.c
0048be
+++ b/src/responder/nss/nsssrv.c
0048be
@@ -378,6 +378,27 @@ int nss_process_init(TALLOC_CTX *mem_ctx,
0048be
         goto fail;
0048be
     }
0048be
 
0048be
+    nctx->pwent = talloc_zero(nctx, struct nss_enum_ctx);
0048be
+    if (nctx->pwent == NULL) {
0048be
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize pwent context!\n");
0048be
+        ret = ENOMEM;
0048be
+        goto fail;
0048be
+    }
0048be
+
0048be
+    nctx->grent = talloc_zero(nctx, struct nss_enum_ctx);
0048be
+    if (nctx->grent == NULL) {
0048be
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize grent context!\n");
0048be
+        ret = ENOMEM;
0048be
+        goto fail;
0048be
+    }
0048be
+
0048be
+    nctx->svcent = talloc_zero(nctx, struct nss_enum_ctx);
0048be
+    if (nctx->svcent == NULL) {
0048be
+        DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize svcent context!\n");
0048be
+        ret = ENOMEM;
0048be
+        goto fail;
0048be
+    }
0048be
+
0048be
     nctx->netgrent = sss_ptr_hash_create(nctx, NULL, NULL);
0048be
     if (nctx->netgrent == NULL) {
0048be
         DEBUG(SSSDBG_FATAL_FAILURE, "Unable to initialize netgroups table!\n");
0048be
-- 
0048be
2.19.1
0048be