Mercurial > dovecot > original-hg > dovecot-1.2
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",