fixed a uid_wrapper bug that caused a segv in the RAW-ACLS test
authorAndrew Tridgell <tridge@samba.org>
Wed, 5 Aug 2009 03:31:06 +0000 (13:31 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 5 Aug 2009 03:32:04 +0000 (13:32 +1000)
lib/uid_wrapper/uid_wrapper.c

index 948ff65b352f0e68484c02c781ca7e3428b91efc..f7f04316bfc77b6d99d827729e2ae739c7e37732 100644 (file)
@@ -42,6 +42,10 @@ static void uwrap_init(void)
        uwrap.initialised = true;
        if (getenv("UID_WRAPPER")) {
                uwrap.enabled = true;
+               /* put us in one group */
+               uwrap.ngroups = 1;
+               uwrap.groups = talloc_array(talloc_autofree_context(), gid_t, 1);
+               uwrap.groups[0] = 0;
        }
 }
 
@@ -101,14 +105,17 @@ _PUBLIC_ int uwrap_setgroups(size_t size, const gid_t *list)
 
        talloc_free(uwrap.groups);
        uwrap.ngroups = 0;
-
-       uwrap.groups = talloc_array(talloc_autofree_context(), gid_t, size);
-       if (uwrap.groups == NULL) {
-               errno = ENOMEM;
-               return -1;
+       uwrap.groups = NULL;
+
+       if (size != 0) {
+               uwrap.groups = talloc_array(talloc_autofree_context(), gid_t, size);
+               if (uwrap.groups == NULL) {
+                       errno = ENOMEM;
+                       return -1;
+               }
+               memcpy(uwrap.groups, list, size*sizeof(gid_t));
+               uwrap.ngroups = size;
        }
-       memcpy(uwrap.groups, list, size*sizeof(gid_t));
-       uwrap.ngroups = size;
        return 0;
 }
 
@@ -130,7 +137,7 @@ _PUBLIC_ int uwrap_getgroups(int size, gid_t *list)
                return -1;
        }
        memcpy(list, uwrap.groups, size*sizeof(gid_t));
-       return 0;
+       return uwrap.ngroups;
 }
 
 _PUBLIC_ uid_t uwrap_getuid(void)