sinnykumari / rpms / sssd

Forked from rpms/sssd 5 years ago
Clone
Fabiano Fidêncio ff81ee8
From b24ef81656fc3d0dce49b1756ba53c46b5881a14 Mon Sep 17 00:00:00 2001
Fabiano Fidêncio ff81ee8
From: Sumit Bose <sbose@redhat.com>
Fabiano Fidêncio ff81ee8
Date: Wed, 18 Apr 2018 10:23:22 +0200
Fabiano Fidêncio ff81ee8
Subject: [PATCH] nss-idmap: use right group list pointer after sss_get_ex()
Fabiano Fidêncio ff81ee8
Fabiano Fidêncio ff81ee8
If the initial array is too small it will be reallocated during
Fabiano Fidêncio ff81ee8
sss_get_ex() and the pointer might change and the initial memory area
Fabiano Fidêncio ff81ee8
should not be used anymore.
Fabiano Fidêncio ff81ee8
Fabiano Fidêncio ff81ee8
Related to https://pagure.io/SSSD/sssd/issue/3715
Fabiano Fidêncio ff81ee8
Fabiano Fidêncio ff81ee8
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
Fabiano Fidêncio ff81ee8
(cherry picked from commit 2c4dc7a4d98c439c69625f12ba4c3c8253f4cc5b)
Fabiano Fidêncio ff81ee8
---
Fabiano Fidêncio ff81ee8
 src/sss_client/idmap/sss_nss_ex.c | 18 +++++++++---------
Fabiano Fidêncio ff81ee8
 1 file changed, 9 insertions(+), 9 deletions(-)
Fabiano Fidêncio ff81ee8
Fabiano Fidêncio ff81ee8
diff --git a/src/sss_client/idmap/sss_nss_ex.c b/src/sss_client/idmap/sss_nss_ex.c
Fabiano Fidêncio ff81ee8
index b87b5e3b2..971422063 100644
Fabiano Fidêncio ff81ee8
--- a/src/sss_client/idmap/sss_nss_ex.c
Fabiano Fidêncio ff81ee8
+++ b/src/sss_client/idmap/sss_nss_ex.c
Fabiano Fidêncio ff81ee8
@@ -485,7 +485,6 @@ int sss_nss_getgrouplist_timeout(const char *name, gid_t group,
Fabiano Fidêncio ff81ee8
                                  uint32_t flags, unsigned int timeout)
Fabiano Fidêncio ff81ee8
 {
Fabiano Fidêncio ff81ee8
     int ret;
Fabiano Fidêncio ff81ee8
-    gid_t *new_groups;
Fabiano Fidêncio ff81ee8
     long int new_ngroups;
Fabiano Fidêncio ff81ee8
     long int start = 1;
Fabiano Fidêncio ff81ee8
     struct nss_input inp = {
Fabiano Fidêncio ff81ee8
@@ -498,27 +497,28 @@ int sss_nss_getgrouplist_timeout(const char *name, gid_t group,
Fabiano Fidêncio ff81ee8
     }
Fabiano Fidêncio ff81ee8
 
Fabiano Fidêncio ff81ee8
     new_ngroups = MAX(1, *ngroups);
Fabiano Fidêncio ff81ee8
-    new_groups = malloc(new_ngroups * sizeof(gid_t));
Fabiano Fidêncio ff81ee8
-    if (new_groups == NULL) {
Fabiano Fidêncio ff81ee8
+    inp.result.initgrrep.groups = malloc(new_ngroups * sizeof(gid_t));
Fabiano Fidêncio ff81ee8
+    if (inp.result.initgrrep.groups == NULL) {
Fabiano Fidêncio ff81ee8
         free(discard_const(inp.rd.data));
Fabiano Fidêncio ff81ee8
         return ENOMEM;
Fabiano Fidêncio ff81ee8
     }
Fabiano Fidêncio ff81ee8
-    new_groups[0] = group;
Fabiano Fidêncio ff81ee8
+    inp.result.initgrrep.groups[0] = group;
Fabiano Fidêncio ff81ee8
 
Fabiano Fidêncio ff81ee8
-    inp.result.initgrrep.groups = new_groups,
Fabiano Fidêncio ff81ee8
     inp.result.initgrrep.ngroups = &new_ngroups;
Fabiano Fidêncio ff81ee8
     inp.result.initgrrep.start = &start;
Fabiano Fidêncio ff81ee8
 
Fabiano Fidêncio ff81ee8
-
Fabiano Fidêncio ff81ee8
+    /* inp.result.initgrrep.groups, inp.result.initgrrep.ngroups and
Fabiano Fidêncio ff81ee8
+     * inp.result.initgrrep.start might be modified by sss_get_ex() */
Fabiano Fidêncio ff81ee8
     ret = sss_get_ex(&inp, flags, timeout);
Fabiano Fidêncio ff81ee8
     free(discard_const(inp.rd.data));
Fabiano Fidêncio ff81ee8
     if (ret != 0) {
Fabiano Fidêncio ff81ee8
-        free(new_groups);
Fabiano Fidêncio ff81ee8
+        free(inp.result.initgrrep.groups);
Fabiano Fidêncio ff81ee8
         return ret;
Fabiano Fidêncio ff81ee8
     }
Fabiano Fidêncio ff81ee8
 
Fabiano Fidêncio ff81ee8
-    memcpy(groups, new_groups, MIN(*ngroups, start) * sizeof(gid_t));
Fabiano Fidêncio ff81ee8
-    free(new_groups);
Fabiano Fidêncio ff81ee8
+    memcpy(groups, inp.result.initgrrep.groups,
Fabiano Fidêncio ff81ee8
+           MIN(*ngroups, start) * sizeof(gid_t));
Fabiano Fidêncio ff81ee8
+    free(inp.result.initgrrep.groups);
Fabiano Fidêncio ff81ee8
 
Fabiano Fidêncio ff81ee8
     if (start > *ngroups) {
Fabiano Fidêncio ff81ee8
         ret = ERANGE;
Fabiano Fidêncio ff81ee8
-- 
Fabiano Fidêncio ff81ee8
2.14.3
Fabiano Fidêncio ff81ee8