summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/security.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/security.cc')
-rw-r--r--winsup/cygwin/security.cc31
1 files changed, 31 insertions, 0 deletions
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
index 971612e17..934ceed9a 100644
--- a/winsup/cygwin/security.cc
+++ b/winsup/cygwin/security.cc
@@ -448,6 +448,30 @@ get_user_primary_group (WCHAR *wlogonserver, const char *user,
return retval;
}
+static int
+get_supplementary_group_sidlist (const char *username, cygsidlist &grp_list)
+{
+ struct group *gr;
+ int cnt = 0;
+
+ for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx)
+ {
+ if (gr->gr_mem)
+ for (int gi = 0; gr->gr_mem[gi]; ++gi)
+ if (strcasematch (username, gr->gr_mem[gi]))
+ {
+ if (gr->gr_passwd && *gr->gr_passwd)
+ {
+ cygsid sid (gr->gr_passwd);
+ if ((PSID)sid && grp_list.add (sid))
+ ++cnt;
+ }
+ break;
+ }
+ }
+ return cnt;
+}
+
static BOOL
get_group_sidlist (const char *logonserver, cygsidlist &grp_list,
cygsid &usersid, cygsid &pgrpsid,
@@ -459,6 +483,7 @@ get_group_sidlist (const char *logonserver, cygsidlist &grp_list,
DWORD ulen = INTERNET_MAX_HOST_NAME_LENGTH + 1;
DWORD dlen = INTERNET_MAX_HOST_NAME_LENGTH + 1;
SID_NAME_USE use;
+ cygsidlist sup_list;
auth_pos = -1;
sys_mbstowcs (wserver, logonserver, INTERNET_MAX_HOST_NAME_LENGTH + 1);
@@ -514,6 +539,12 @@ get_group_sidlist (const char *logonserver, cygsidlist &grp_list,
return FALSE;
if (!grp_list.contains (pgrpsid))
grp_list += pgrpsid;
+ if (get_supplementary_group_sidlist (user, sup_list))
+ {
+ for (int i = 0; i < sup_list.count; ++i)
+ if (!grp_list.contains (sup_list.sids[i]))
+ grp_list += sup_list.sids[i];
+ }
return TRUE;
}