aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/sec_helper.cc38
-rw-r--r--winsup/cygwin/security.cc21
3 files changed, 42 insertions, 25 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index a204f9f..ae748e0 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,11 @@
+2002-10-22 Pierre Humblet <pierre.humblet@ieee.org>
+
+ * 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 <cgf@redhat.com>
* 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 fa05193..8e06810 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 262d2aa..b7e70cf 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;