From 5324166a5afcb5a0dafa4daa4aa2c74b9c7dce47 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Tue, 20 Apr 2004 01:40:06 +0000 Subject: [PATCH] r290: combination of BUG 1081 and patch from J. Klinger -- added remove_duplicate_gids() to smbd and winbindd --- source/lib/system_smbd.c | 5 +++++ source/lib/util_getent.c | 45 ++++++++++++++++++++++++++++++++++++++++ source/nsswitch/winbindd_group.c | 2 ++ 3 files changed, 52 insertions(+) diff --git a/source/lib/system_smbd.c b/source/lib/system_smbd.c index 73c910e631d..7edc7ca98f9 100644 --- a/source/lib/system_smbd.c +++ b/source/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/source/lib/util_getent.c b/source/lib/util_getent.c index 3544c1678cc..4431d6a2a47 100644 --- a/source/lib/util_getent.c +++ b/source/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; iresponse.data.num_entries = num_gids; -- 2.11.4.GIT