summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerald Carter <jerry@samba.org>2004-04-20 01:24:47 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:51:16 -0500
commitae2e6490743c0fd89e11c85cd72d549f39be7674 (patch)
tree499689b37b255f8cebeb3b524807c93b30b13363
parent335b10ef10f9825ad52501c77bc6b77cdad39067 (diff)
downloadsamba-ae2e6490743c0fd89e11c85cd72d549f39be7674.tar.gz
samba-ae2e6490743c0fd89e11c85cd72d549f39be7674.tar.bz2
samba-ae2e6490743c0fd89e11c85cd72d549f39be7674.zip
r288: combination of BUG 1081 and patch from J. Klinger -- added remove_duplicate_gids() to smbd and winbindd
(This used to be commit 95c68103ea9dbd02651e26fcaa15dd054b157529)
-rw-r--r--source3/lib/system_smbd.c5
-rw-r--r--source3/lib/util_getent.c45
-rw-r--r--source3/nsswitch/winbindd_group.c2
3 files changed, 52 insertions, 0 deletions
diff --git a/source3/lib/system_smbd.c b/source3/lib/system_smbd.c
index 73c910e631..7edc7ca98f 100644
--- a/source3/lib/system_smbd.c
+++ b/source3/lib/system_smbd.c
@@ -99,6 +99,11 @@ static int getgrouplist_internals(const char *user, gid_t gid, gid_t *groups, in
free(gids_saved);
return -1;
}
+
+ /* this will remove any duplicates gids in the list and
+ update the group counter */
+
+ remove_duplicate_gids( grpcnt, groups );
free(gids_saved);
return ret;
diff --git a/source3/lib/util_getent.c b/source3/lib/util_getent.c
index 3544c1678c..4431d6a2a4 100644
--- a/source3/lib/util_getent.c
+++ b/source3/lib/util_getent.c
@@ -304,3 +304,48 @@ void free_userlist(struct sys_userlist *list_head)
SAFE_FREE(old_head);
}
}
+
+/****************************************************************
+****************************************************************/
+
+static int int_compare( int *a, int *b )
+{
+ if ( *a == *b )
+ return 0;
+ else if ( *a < *b )
+ return -1;
+ else
+ return 1;
+}
+
+void remove_duplicate_gids( int *num_groups, gid_t *groups )
+{
+ int i;
+ int count = *num_groups;
+
+ if ( *num_groups <= 0 || !groups )
+ return;
+
+
+ DEBUG(8,("remove_duplicate_gids: Enter %d gids\n", *num_groups));
+
+ qsort( groups, *num_groups, sizeof(gid_t), QSORT_CAST int_compare );
+
+ for ( i=1; i<count; ) {
+ if ( groups[i-1] == groups[i] ) {
+ memmove( &groups[i-1], &groups[i], (count - i + 1)*sizeof(gid_t) );
+
+ /* decrement the total number of groups and do not increment
+ the loop counter */
+ count--;
+ continue;
+ }
+ i++;
+ }
+
+ *num_groups = count;
+
+ DEBUG(8,("remove_duplicate_gids: Exit %d gids\n", *num_groups));
+
+ return;
+}
diff --git a/source3/nsswitch/winbindd_group.c b/source3/nsswitch/winbindd_group.c
index f9b6df1aed..8f5306321a 100644
--- a/source3/nsswitch/winbindd_group.c
+++ b/source3/nsswitch/winbindd_group.c
@@ -1118,6 +1118,8 @@ enum winbindd_result winbindd_getgroups(struct winbindd_cli_state *state)
}
}
+ remove_duplicate_gids( &num_gids, gid_list );
+
/* Send data back to client */
state->response.data.num_entries = num_gids;