changeset 7124:fe42e3097e23 HEAD

Setting extra groups crashed.
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Jan 2008 05:16:32 +0200
parents 25e7c37c7c10
children 7ee2bee70d6a
files src/lib/restrict-access.c
diffstat 1 files changed, 9 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/restrict-access.c	Sun Jan 06 03:17:20 2008 +0200
+++ b/src/lib/restrict-access.c	Sun Jan 06 05:16:32 2008 +0200
@@ -96,7 +96,7 @@
 static void fix_groups_list(const char *extra_groups, gid_t egid,
 			    bool preserve_existing, bool *have_root_group)
 {
-	gid_t *gid_list;
+	gid_t *gid_list, *gid_list2;
 	const char *const *tmp, *empty = NULL;
 	unsigned int gid_count;
 
@@ -123,12 +123,15 @@
 		gid_count = 1;
 	}
 
-	/* add extra groups to gids list */
-	for (; *tmp != NULL; tmp++) {
-		if (!t_try_realloc(gid_list, (gid_count+1) * sizeof(gid_t)))
-			i_unreached();
-		gid_list[gid_count++] = get_group_id(*tmp);
+	if (*tmp != NULL) {
+		/* @UNSAFE: add extra groups to gids list */
+		gid_list2 = t_new(gid_t, gid_count + str_array_length(tmp));
+		memcpy(gid_list2, gid_list, gid_count * sizeof(gid_t));
+		for (; *tmp != NULL; tmp++)
+			gid_list2[gid_count++] = get_group_id(*tmp);
+		gid_list = gid_list2;
 	}
+
 	if (setgroups(gid_count, gid_list) < 0) {
 		if (errno == EINVAL) {
 			i_fatal("setgroups(%s) failed: Too many extra groups",