OSDN Git Service

* sec_helper.cc (cygsid::get_id): If the sid matches a sid stored in
authorcgf <cgf>
Tue, 22 Oct 2002 16:22:10 +0000 (16:22 +0000)
committercgf <cgf>
Tue, 22 Oct 2002 16:22:10 +0000 (16:22 +0000)
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
winsup/cygwin/sec_helper.cc
winsup/cygwin/security.cc

index a204f9f..ae748e0 100644 (file)
@@ -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
index fa05193..8e06810 100644 (file)
@@ -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)
index 262d2aa..b7e70cf 100644 (file)
@@ -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;