summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/uinfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r--winsup/cygwin/uinfo.cc27
1 files changed, 19 insertions, 8 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 6b07ea437..7c76722f0 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -103,18 +103,29 @@ internal_getlogin (cygheap_user &user)
void
uinfo_init ()
{
- if (!child_proc_info || cygheap->user.token != INVALID_HANDLE_VALUE)
+ if (child_proc_info && cygheap->user.token == INVALID_HANDLE_VALUE)
+ return;
+
+ if (!child_proc_info)
+ internal_getlogin (cygheap->user); /* Set the cygheap->user. */
+ /* Conditions must match those in spawn to allow starting child
+ processes with ruid != euid and rgid != egid. */
+ else if (cygheap->user.issetuid ()
+ && cygheap->user.orig_uid == cygheap->user.real_uid
+ && cygheap->user.orig_gid == cygheap->user.real_gid
+ && !cygheap->user.groups.issetgroups ())
{
- 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 */
+ if (!ImpersonateLoggedOnUser (cygheap->user.token))
+ system_printf ("ImpersonateLoggedOnUser: %E");
+ return;
}
- /* Real and effective uid/gid are identical on process start up. */
+ else
+ CloseHandle (cygheap->user.token);
+
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 *