URL: https://github.com/SSSD/sssd/pull/395
Author: jhrozek
 Title: #395: KCM: Three trivial fixes
Action: synchronized

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/395/head:pr395
git checkout pr395
From 9d8f1f368a6cd226b4c4c8acea91ce59708de293 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Tue, 19 Sep 2017 13:45:19 +0200
Subject: [PATCH 1/3] KCM: Do not leak newly created ccache in case the name is
 malformed

This is not a big deal as the mem_ctx parameter of the operation is
typically just a short-lived operation context. Nonetheless, it is best
practice to not rely on how the memory context is set up in utility
functions.
---
 src/responder/kcm/kcmsrv_ccache.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/responder/kcm/kcmsrv_ccache.c b/src/responder/kcm/kcmsrv_ccache.c
index a22184e0f..d3ed10eee 100644
--- a/src/responder/kcm/kcmsrv_ccache.c
+++ b/src/responder/kcm/kcmsrv_ccache.c
@@ -45,7 +45,7 @@ errno_t kcm_cc_new(TALLOC_CTX *mem_ctx,
                    krb5_principal princ,
                    struct kcm_ccache **_cc)
 {
-    struct kcm_ccache *cc;
+    struct kcm_ccache *cc = NULL;
     krb5_error_code kret;
     errno_t ret;
 
@@ -57,13 +57,13 @@ errno_t kcm_cc_new(TALLOC_CTX *mem_ctx,
     ret = kcm_check_name(name, owner);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Name %s is malformed\n", name);
-        return ret;
+        goto done;
     }
 
     cc->name = talloc_strdup(cc, name);
     if (cc->name == NULL) {
-        talloc_free(cc);
-        return ENOMEM;
+        ret = ENOMEM;
+        goto done;
     }
 
     uuid_generate(cc->uuid);
@@ -74,8 +74,8 @@ errno_t kcm_cc_new(TALLOC_CTX *mem_ctx,
         DEBUG(SSSDBG_OP_FAILURE,
               "krb5_copy_principal failed: [%d][%s]\n", kret, err_msg);
         sss_krb5_free_error_message(k5c, err_msg);
-        talloc_free(cc);
-        return ERR_INTERNAL;
+        ret = ERR_INTERNAL;
+        goto done;
     }
 
     cc->owner.uid = cli_creds_get_uid(owner);
@@ -84,7 +84,12 @@ errno_t kcm_cc_new(TALLOC_CTX *mem_ctx,
 
     talloc_set_destructor(cc, kcm_cc_destructor);
     *_cc = cc;
-    return EOK;
+    ret = EOK;
+done:
+    if (ret != EOK) {
+        talloc_free(cc);
+    }
+    return ret;
 }
 
 const char *kcm_cc_get_name(struct kcm_ccache *cc)

From d4bde136d9d50e567d303932002f68a85a4bc7de Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Wed, 27 Sep 2017 16:48:06 +0200
Subject: [PATCH 2/3] KCM: Use the right memory context

Inside the tevent request, we should use 'state' as the intermediate
memory context and steal the result up to 'mem_ctx' on success.
'mem_ctx' itself should only be used to create the tevent_req as the
first thing during the request creation.

However, this bug is not very severe as the mem_ctx was always the KCM
operation memory context, so the memory was freed when the operation
terminated.
---
 src/responder/kcm/kcmsrv_ccache.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/responder/kcm/kcmsrv_ccache.c b/src/responder/kcm/kcmsrv_ccache.c
index d3ed10eee..63dd1f85b 100644
--- a/src/responder/kcm/kcmsrv_ccache.c
+++ b/src/responder/kcm/kcmsrv_ccache.c
@@ -302,7 +302,7 @@ struct tevent_req *kcm_ccdb_nextid_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = state->db->ops->nextid_send(mem_ctx, ev, state->db, client);
+    subreq = state->db->ops->nextid_send(state, ev, state->db, client);
     if (subreq == NULL) {
         ret = ENOMEM;
         goto immediate;
@@ -390,7 +390,7 @@ struct tevent_req *kcm_ccdb_list_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = state->db->ops->list_send(mem_ctx,
+    subreq = state->db->ops->list_send(state,
                                        ev,
                                        state->db,
                                        client);
@@ -467,7 +467,7 @@ struct tevent_req *kcm_ccdb_get_default_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = db->ops->get_default_send(mem_ctx, ev, db, client);
+    subreq = db->ops->get_default_send(state, ev, db, client);
     if (subreq == NULL) {
         ret = ENOMEM;
         goto immediate;
@@ -1034,7 +1034,7 @@ struct tevent_req *kcm_ccdb_create_cc_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = state->db->ops->create_send(mem_ctx,
+    subreq = state->db->ops->create_send(state,
                                          ev,
                                          state->db,
                                          client,
@@ -1129,7 +1129,7 @@ struct tevent_req *kcm_ccdb_mod_cc_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = state->db->ops->mod_send(mem_ctx,
+    subreq = state->db->ops->mod_send(state,
                                       ev,
                                       state->db,
                                       client,
@@ -1204,7 +1204,7 @@ struct tevent_req *kcm_ccdb_store_cred_blob_send(TALLOC_CTX *mem_ctx,
         goto immediate;
     }
 
-    subreq = state->db->ops->store_cred_send(mem_ctx,
+    subreq = state->db->ops->store_cred_send(state,
                                              ev,
                                              state->db,
                                              client,

From e94821f7e547fdd3e3bb586fb468cadc86f5cf10 Mon Sep 17 00:00:00 2001
From: Jakub Hrozek <jhro...@redhat.com>
Date: Thu, 28 Sep 2017 17:51:11 +0200
Subject: [PATCH 3/3] KCM: Add some forgotten NULL checks

Several memory allocations across the KCM codebase did not check their
result for NULL. This patch fixes that.
---
 src/responder/kcm/kcmsrv_ccache.c     |  4 ++++
 src/responder/kcm/kcmsrv_ccache_mem.c | 26 ++++++++++++++++++++++++--
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/responder/kcm/kcmsrv_ccache.c b/src/responder/kcm/kcmsrv_ccache.c
index 63dd1f85b..87a9bab73 100644
--- a/src/responder/kcm/kcmsrv_ccache.c
+++ b/src/responder/kcm/kcmsrv_ccache.c
@@ -1291,6 +1291,10 @@ struct tevent_req *kcm_ccdb_delete_cc_send(TALLOC_CTX *mem_ctx,
                                          state->db,
                                          state->client,
                                          state->uuid);
+    if (subreq == NULL) {
+        ret = ENOMEM;
+        goto immediate;
+    }
     tevent_req_set_callback(subreq, kcm_ccdb_delete_done, req);
 
     return req;
diff --git a/src/responder/kcm/kcmsrv_ccache_mem.c b/src/responder/kcm/kcmsrv_ccache_mem.c
index 1c4f3df8d..38bc2050d 100644
--- a/src/responder/kcm/kcmsrv_ccache_mem.c
+++ b/src/responder/kcm/kcmsrv_ccache_mem.c
@@ -405,6 +405,7 @@ static struct tevent_req *ccdb_mem_getbyuuid_send(TALLOC_CTX *mem_ctx,
     struct ccdb_mem_getbyuuid_state *state = NULL;
     struct ccdb_mem *memdb = talloc_get_type(db->db_handle, struct ccdb_mem);
     struct ccache_mem_wrap *ccwrap = NULL;
+    errno_t ret;
 
     req = tevent_req_create(mem_ctx, &state, struct ccdb_mem_getbyuuid_state);
     if (req == NULL) {
@@ -414,9 +415,19 @@ static struct tevent_req *ccdb_mem_getbyuuid_send(TALLOC_CTX *mem_ctx,
     ccwrap = memdb_get_by_uuid(memdb, client, uuid);
     if (ccwrap != NULL) {
         state->cc = kcm_ccache_dup(state, ccwrap->cc);
+        if (state->cc == NULL) {
+            ret = ENOMEM;
+            goto immediate;
+        }
     }
 
-    tevent_req_done(req);
+    ret = EOK;
+immediate:
+    if (ret == EOK) {
+        tevent_req_done(req);
+    } else {
+        tevent_req_error(req, ret);
+    }
     tevent_req_post(req, ev);
     return req;
 }
@@ -447,6 +458,7 @@ static struct tevent_req *ccdb_mem_getbyname_send(TALLOC_CTX *mem_ctx,
     struct ccdb_mem_getbyname_state *state = NULL;
     struct ccache_mem_wrap *ccwrap = NULL;
     struct ccdb_mem *memdb = talloc_get_type(db->db_handle, struct ccdb_mem);
+    errno_t ret;
 
     req = tevent_req_create(mem_ctx, &state, struct ccdb_mem_getbyname_state);
     if (req == NULL) {
@@ -456,9 +468,19 @@ static struct tevent_req *ccdb_mem_getbyname_send(TALLOC_CTX *mem_ctx,
     ccwrap = memdb_get_by_name(memdb, client, name);
     if (ccwrap != NULL) {
         state->cc = kcm_ccache_dup(state, ccwrap->cc);
+        if (state->cc == NULL) {
+            ret = ENOMEM;
+            goto immediate;
+        }
     }
 
-    tevent_req_done(req);
+    ret = EOK;
+immediate:
+    if (ret == EOK) {
+        tevent_req_done(req);
+    } else {
+        tevent_req_error(req, ret);
+    }
     tevent_req_post(req, ev);
     return req;
 }
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org

Reply via email to