OSDN Git Service

* syscalls.cc (seteuid32): On Win95 get the pw entry. If it exists
authorcorinna <corinna>
Sat, 25 Jan 2003 10:36:46 +0000 (10:36 +0000)
committercorinna <corinna>
Sat, 25 Jan 2003 10:36:46 +0000 (10:36 +0000)
update the euid and call cygheap->user.set_name. Remove special
handling of ILLEGAL_UID.
(setgid32): Add a debug_printf. On Win95, always set the egid.
Remove special handling of ILLEGAL_GID. Do not compare gid and gr_gid.
* child_info.h (class cygheap_exec_info): Remove uid.
* spawn.cc (spawn_guts): Do not set ciresrv.moreinfo->uid.
* dcrto.cc (dll_crt0_1): Always call uinfo_init.
* uinfo.cc (uinfo_init): Reorganize and close handle if needed.
(cygheap_user::ontherange): Do not call internal_getpwnam if pw is NULL.

winsup/cygwin/ChangeLog
winsup/cygwin/child_info.h
winsup/cygwin/dcrt0.cc
winsup/cygwin/spawn.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/uinfo.cc

index 0e5a318..e27d5dc 100644 (file)
@@ -1,3 +1,16 @@
+2003-01-25  Pierre Humblet  <pierre.humblet@ieee.org>
+
+       * syscalls.cc (seteuid32): On Win95 get the pw entry. If it exists
+       update the euid and call cygheap->user.set_name. Remove special
+       handling of ILLEGAL_UID.
+       (setgid32): Add a debug_printf. On Win95, always set the egid. 
+       Remove special handling of ILLEGAL_GID. Do not compare gid and gr_gid.
+       * child_info.h (class cygheap_exec_info): Remove uid.
+       * spawn.cc (spawn_guts): Do not set ciresrv.moreinfo->uid.
+       * dcrto.cc (dll_crt0_1): Always call uinfo_init.
+       * uinfo.cc (uinfo_init): Reorganize and close handle if needed.
+       (cygheap_user::ontherange): Do not call internal_getpwnam if pw is NULL.
+
 2003-01-24  Christopher Faylor  <cgf@redhat.com>
 
        * fhandler_console.cc (fhandler_console::send_winch_maybe): Reset
index 2ac0152..f7d69ca 100644 (file)
@@ -71,7 +71,6 @@ class fhandler_base;
 class cygheap_exec_info
 {
 public:
-  __uid32_t uid;
   char *old_title;
   int argc;
   char **argv;
index 004837d..1c30cea 100644 (file)
@@ -684,9 +684,8 @@ dll_crt0_1 ()
   /* Init global well known SID objects */
   cygsid::init ();
 
-  /* Initialize uid, gid if necessary. */
-  if (child_proc_info == NULL || spawn_info->moreinfo->uid == ILLEGAL_UID)
-    uinfo_init ();
+  /* Initialize user info. */
+  uinfo_init ();
 
   /* Initialize signal/subprocess handling. */
   sigproc_init ();
index 9c055c8..9b0b4a9 100644 (file)
@@ -658,7 +658,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
       char wstname[1024];
       char dskname[1024];
 
-      ciresrv.moreinfo->uid = ILLEGAL_UID;
       hwst = GetProcessWindowStation ();
       SetUserObjectSecurity (hwst, &dsi, get_null_sd ());
       GetUserObjectInformation (hwst, UOI_NAME, wstname, 1024, &n);
index b844a77..f50905c 100644 (file)
@@ -1948,22 +1948,14 @@ mkfifo (const char *_path, mode_t mode)
 extern "C" int
 seteuid32 (__uid32_t uid)
 {
+  debug_printf ("uid: %u myself->gid: %u", uid, myself->gid);
 
-  debug_printf ("uid: %d myself->gid: %d", uid, myself->gid);
-
-  if (!wincap.has_security ()
-      || (uid == myself->uid && !cygheap->user.groups.ischanged))
+  if (uid == myself->uid && !cygheap->user.groups.ischanged)
     {
       debug_printf ("Nothing happens");
       return 0;
     }
 
-  if (uid == ILLEGAL_UID)
-    {
-      set_errno (EINVAL);
-      return -1;
-    }
-
   sigframe thisframe (mainthread);
   cygsid usersid;
   user_groups &groups = cygheap->user.groups;
@@ -1974,6 +1966,8 @@ seteuid32 (__uid32_t uid)
   PSID origpsid, psid2 = NO_SID;
 
   pw_new = internal_getpwuid (uid);
+  if (!wincap.has_security () && pw_new)
+    goto success;
   if (!usersid.getfrompw (pw_new))
     {
       set_errno (EINVAL);
@@ -2092,9 +2086,9 @@ seteuid32 (__uid32_t uid)
       sav_token != cygheap->user.token &&
       sav_token_is_internal_token)
       CloseHandle (sav_token);
-  cygheap->user.set_name (pw_new->pw_name);
   cygheap->user.set_sid (usersid);
 success:
+  cygheap->user.set_name (pw_new->pw_name);
   myself->uid = uid;
   groups.ischanged = FALSE;
   return 0;
@@ -2160,22 +2154,21 @@ setreuid (__uid16_t ruid, __uid16_t euid)
 extern "C" int
 setegid32 (__gid32_t gid)
 {
-  if (!wincap.has_security () || gid == myself->gid)
-    return 0;
+  debug_printf ("new egid: %u current: %u", gid, myself->gid);
 
-  if (gid == ILLEGAL_GID)
+  if (gid == myself->gid || !wincap.has_security ())
     {
-      set_errno (EINVAL);
-      return -1;
+      myself->gid = gid;
+      return 0;
     }
 
   sigframe thisframe (mainthread);
   user_groups * groups = &cygheap->user.groups;
   cygsid gsid;
   HANDLE ptok;
-
   struct __group32 * gr = internal_getgrgid (gid);
-  if (!gr || gr->gr_gid != gid || !gsid.getfromgr (gr))
+
+  if (!gsid.getfromgr (gr))
     {
       set_errno (EINVAL);
       return -1;
index b52cc09..809dab5 100644 (file)
@@ -102,15 +102,18 @@ internal_getlogin (cygheap_user &user)
 void
 uinfo_init ()
 {
-  if (!child_proc_info)
-    internal_getlogin (cygheap->user); /* Set the cygheap->user. */
-
+  if (!child_proc_info || cygheap->user.token != INVALID_HANDLE_VALUE)
+    {
+      if (!child_proc_info)
+       internal_getlogin (cygheap->user); /* Set the cygheap->user. */
+      else
+        CloseHandle (cygheap->user.token);
+      cygheap->user.set_orig_sid ();   /* Update the original sid */
+      cygheap->user.token = INVALID_HANDLE_VALUE; /* No token present */
+    }
   /* Real and effective uid/gid are identical on process start up. */
   cygheap->user.orig_uid = cygheap->user.real_uid = myself->uid;
   cygheap->user.orig_gid = cygheap->user.real_gid = myself->gid;
-  cygheap->user.set_orig_sid ();       /* Update the original sid */
-
-  cygheap->user.token = INVALID_HANDLE_VALUE; /* No token present */
 }
 
 extern "C" char *
@@ -214,8 +217,6 @@ cygheap_user::ontherange (homebodies what, struct passwd *pw)
        debug_printf ("HOME is already in the environment %s", p);
       else
        {
-         if (!pw)
-           pw = internal_getpwnam (name ());
          if (pw && pw->pw_dir && *pw->pw_dir)
            {
              debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir);