From 329b9ead3ea5a48d452ce48538a4584835c70555 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 22 Oct 2002 16:22:10 +0000 Subject: [PATCH] * sec_helper.cc (cygsid::get_id): If the sid matches a sid stored in cygheap->user, return the uid or gid from myself. * security.cc (alloc_sd): If gid == myself->gid, return the group sid from cygheap->user. Remove the test for uid == original_uid, which is counter-productive. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/sec_helper.cc | 38 +++++++++++++++++++++---------------- winsup/cygwin/security.cc | 21 +++++++++++--------- 3 files changed, 42 insertions(+), 25 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a204f9f81..ae748e04c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2002-10-22 Pierre Humblet + + * sec_helper.cc (cygsid::get_id): If the sid matches a sid stored in + cygheap->user, return the uid or gid from myself. + * security.cc (alloc_sd): If gid == myself->gid, return the group sid + from cygheap->user. Remove the test for uid == original_uid, which is + counter-productive. + 2002-10-22 Christopher Faylor * cygheap.cc (cygheap_fixup_in_child): Use user_heap element in diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc index fa0519371..8e06810b9 100644 --- a/winsup/cygwin/sec_helper.cc +++ b/winsup/cygwin/sec_helper.cc @@ -162,14 +162,17 @@ cygsid::get_id (BOOL search_grp, int *type) if (!search_grp) { struct passwd *pw; - for (int pidx = 0; (pw = internal_getpwent (pidx)); ++pidx) - { - if (sid.getfrompw (pw) && sid == psid) - { - id = pw->pw_uid; - break; - } - } + if (EqualSid(psid, cygheap->user.sid ())) + id = myself->uid; + else + for (int pidx = 0; (pw = internal_getpwent (pidx)); ++pidx) + { + if (sid.getfrompw (pw) && sid == psid) + { + id = pw->pw_uid; + break; + } + } if (id >= 0) { if (type) @@ -180,14 +183,17 @@ cygsid::get_id (BOOL search_grp, int *type) if (search_grp || type) { struct __group32 *gr; - for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) - { - if (sid.getfromgr (gr) && sid == psid) - { - id = gr->gr_gid; - break; - } - } + if (cygheap->user.groups.pgsid == psid) + id = myself->gid; + else + for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx) + { + if (sid.getfromgr (gr) && sid == psid) + { + id = gr->gr_gid; + break; + } + } if (id >= 0) { if (type) diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc index 262d2aaff..b7e70cf05 100644 --- a/winsup/cygwin/security.cc +++ b/winsup/cygwin/security.cc @@ -1536,9 +1536,7 @@ alloc_sd (__uid32_t uid, __gid32_t gid, int attribute, /* Check for current user first */ if (uid == myself->uid) owner_sid = cygheap->user.sid (); - else if (uid == cygheap->user.orig_uid) - owner_sid = cygheap->user.orig_sid (); - if (!owner_sid) + else { /* Otherwise retrieve user data from /etc/passwd */ struct passwd *pw = getpwuid32 (uid); @@ -1559,12 +1557,17 @@ alloc_sd (__uid32_t uid, __gid32_t gid, int attribute, /* Get SID of new group. */ cygsid group_sid (NO_SID); - struct __group32 *grp = getgrgid32 (gid); - if (!grp) - debug_printf ("no /etc/group entry for %d", gid); - else if (!group_sid.getfromgr (grp)) - debug_printf ("no SID for group %d", gid); - + /* Check for current user first */ + if (gid == myself->gid) + group_sid = cygheap->user.groups.pgsid; + else + { + struct __group32 *grp = getgrgid32 (gid); + if (!grp) + debug_printf ("no /etc/group entry for %d", gid); + else if (!group_sid.getfromgr (grp)) + debug_printf ("no SID for group %d", gid); + } /* Initialize local security descriptor. */ SECURITY_DESCRIPTOR sd; PSECURITY_DESCRIPTOR psd = NULL;