summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2003-02-17 12:04:09 +0000
committerAndrew Bartlett <abartlet@samba.org>2003-02-17 12:04:09 +0000
commit55da3690b7cc6e84184b4794bd0fb37e26db20e3 (patch)
treece0e447df9ccdc1cbd04c80b9d7463f22b80f616
parentf203f1643c520f3887a004d58c6bbe130687b30c (diff)
downloadsamba-55da3690b7cc6e84184b4794bd0fb37e26db20e3.tar.gz
samba-55da3690b7cc6e84184b4794bd0fb37e26db20e3.tar.bz2
samba-55da3690b7cc6e84184b4794bd0fb37e26db20e3.zip
Try to make our getgrouplist replacement better match the 'real' implemenations.
In particular, make sure we include the primary gid in the list. Andrew Bartlett (This used to be commit 0cd4b339b7eff55019caaeaa998d5e70b2eed200)
-rw-r--r--source3/lib/system_smbd.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/source3/lib/system_smbd.c b/source3/lib/system_smbd.c
index 0cd3086945..3ae0a6395e 100644
--- a/source3/lib/system_smbd.c
+++ b/source3/lib/system_smbd.c
@@ -39,7 +39,7 @@
static int getgrouplist_internals(const char *user, gid_t gid, gid_t *groups, int *grpcnt)
{
gid_t *gids_saved;
- int ret, ngrp_saved;
+ int ret, ngrp_saved, num_gids;
if (non_root_mode()) {
*grpcnt = 0;
@@ -78,9 +78,16 @@ static int getgrouplist_internals(const char *user, gid_t gid, gid_t *groups, in
set_effective_gid(gid);
setgid(gid);
- ret = getgroups(*grpcnt, groups);
- if (ret >= 0) {
- *grpcnt = ret;
+ num_gids = getgroups(0, NULL);
+ if (num_gids + 1 > *grpcnt) {
+ *grpcnt = num_gids + 1;
+ ret = -1;
+ } else {
+ ret = getgroups(*grpcnt - 1, &groups[1]);
+ if (ret >= 0) {
+ groups[0] = gid;
+ *grpcnt = ret + 1;
+ }
}
restore_re_gid();