diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-10-05 15:36:41 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-10-05 15:36:41 +0000 |
commit | 695c43708f8778c09915b297c95e48d66c814d0d (patch) | |
tree | b5593c4094f5e8b2b2e1cb075392987d00f079b1 /grp/compat-initgroups.c | |
parent | 6ab5f50de41c22de3752722108def4ae721aec13 (diff) | |
download | glibc-695c43708f8778c09915b297c95e48d66c814d0d.zip glibc-695c43708f8778c09915b297c95e48d66c814d0d.tar.gz glibc-695c43708f8778c09915b297c95e48d66c814d0d.tar.bz2 |
Update.
2004-10-05 Ulrich Drepper <drepper@redhat.com>
* grp/initgroups.c: Remove duplicate group IDs.
* grp/compat-initgroups.c: Likewise.
* nscd/initgrcache.c: Likewise.
Diffstat (limited to 'grp/compat-initgroups.c')
-rw-r--r-- | grp/compat-initgroups.c | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/grp/compat-initgroups.c b/grp/compat-initgroups.c index 585c4ae..efd875a 100644 --- a/grp/compat-initgroups.c +++ b/grp/compat-initgroups.c @@ -58,31 +58,42 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start, for (m = grpbuf.gr_mem; *m != NULL; ++m) if (strcmp (*m, user) == 0) { - /* Matches user. Insert this group. */ - if (__builtin_expect (*start == *size, 0)) - { - /* Need a bigger buffer. */ - gid_t *newgroups; - long int newsize; - - if (limit > 0 && *size == limit) - /* We reached the maximum. */ - goto done; - - if (limit <= 0) - newsize = 2 * *size; - else - newsize = MIN (limit, 2 * *size); - - newgroups = realloc (groups, newsize * sizeof (*groups)); - if (newgroups == NULL) - goto done; - *groupsp = groups = newgroups; - *size = newsize; - } - - groups[*start] = grpbuf.gr_gid; - *start += 1; + /* Check whether the group is already on the list. */ + long int cnt; + for (cnt = 0; cnt < *start; ++cnt) + if (groups[cnt] == grpbuf.gr_gid) + break; + + if (cnt == *start) + { + /* Matches user and not yet on the list. Insert + this group. */ + if (__builtin_expect (*start == *size, 0)) + { + /* Need a bigger buffer. */ + gid_t *newgroups; + long int newsize; + + if (limit > 0 && *size == limit) + /* We reached the maximum. */ + goto done; + + if (limit <= 0) + newsize = 2 * *size; + else + newsize = MIN (limit, 2 * *size); + + newgroups = realloc (groups, + newsize * sizeof (*groups)); + if (newgroups == NULL) + goto done; + *groupsp = groups = newgroups; + *size = newsize; + } + + groups[*start] = grpbuf.gr_gid; + *start += 1; + } break; } |