* 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.
This commit is contained in:
Corinna Vinschen 2003-01-25 10:36:46 +00:00
parent 45dbfc2611
commit 4f7e12dd26
6 changed files with 35 additions and 31 deletions

View 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> 2003-01-24 Christopher Faylor <cgf@redhat.com>
* fhandler_console.cc (fhandler_console::send_winch_maybe): Reset * fhandler_console.cc (fhandler_console::send_winch_maybe): Reset

View File

@ -71,7 +71,6 @@ class fhandler_base;
class cygheap_exec_info class cygheap_exec_info
{ {
public: public:
__uid32_t uid;
char *old_title; char *old_title;
int argc; int argc;
char **argv; char **argv;

View File

@ -684,9 +684,8 @@ dll_crt0_1 ()
/* Init global well known SID objects */ /* Init global well known SID objects */
cygsid::init (); cygsid::init ();
/* Initialize uid, gid if necessary. */ /* Initialize user info. */
if (child_proc_info == NULL || spawn_info->moreinfo->uid == ILLEGAL_UID) uinfo_init ();
uinfo_init ();
/* Initialize signal/subprocess handling. */ /* Initialize signal/subprocess handling. */
sigproc_init (); sigproc_init ();

View File

@ -658,7 +658,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
char wstname[1024]; char wstname[1024];
char dskname[1024]; char dskname[1024];
ciresrv.moreinfo->uid = ILLEGAL_UID;
hwst = GetProcessWindowStation (); hwst = GetProcessWindowStation ();
SetUserObjectSecurity (hwst, &dsi, get_null_sd ()); SetUserObjectSecurity (hwst, &dsi, get_null_sd ());
GetUserObjectInformation (hwst, UOI_NAME, wstname, 1024, &n); GetUserObjectInformation (hwst, UOI_NAME, wstname, 1024, &n);

View File

@ -1948,22 +1948,14 @@ mkfifo (const char *_path, mode_t mode)
extern "C" int extern "C" int
seteuid32 (__uid32_t uid) 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 (uid == myself->uid && !cygheap->user.groups.ischanged)
if (!wincap.has_security ()
|| (uid == myself->uid && !cygheap->user.groups.ischanged))
{ {
debug_printf ("Nothing happens"); debug_printf ("Nothing happens");
return 0; return 0;
} }
if (uid == ILLEGAL_UID)
{
set_errno (EINVAL);
return -1;
}
sigframe thisframe (mainthread); sigframe thisframe (mainthread);
cygsid usersid; cygsid usersid;
user_groups &groups = cygheap->user.groups; user_groups &groups = cygheap->user.groups;
@ -1974,6 +1966,8 @@ seteuid32 (__uid32_t uid)
PSID origpsid, psid2 = NO_SID; PSID origpsid, psid2 = NO_SID;
pw_new = internal_getpwuid (uid); pw_new = internal_getpwuid (uid);
if (!wincap.has_security () && pw_new)
goto success;
if (!usersid.getfrompw (pw_new)) if (!usersid.getfrompw (pw_new))
{ {
set_errno (EINVAL); set_errno (EINVAL);
@ -2092,9 +2086,9 @@ seteuid32 (__uid32_t uid)
sav_token != cygheap->user.token && sav_token != cygheap->user.token &&
sav_token_is_internal_token) sav_token_is_internal_token)
CloseHandle (sav_token); CloseHandle (sav_token);
cygheap->user.set_name (pw_new->pw_name);
cygheap->user.set_sid (usersid); cygheap->user.set_sid (usersid);
success: success:
cygheap->user.set_name (pw_new->pw_name);
myself->uid = uid; myself->uid = uid;
groups.ischanged = FALSE; groups.ischanged = FALSE;
return 0; return 0;
@ -2160,22 +2154,21 @@ setreuid (__uid16_t ruid, __uid16_t euid)
extern "C" int extern "C" int
setegid32 (__gid32_t gid) setegid32 (__gid32_t gid)
{ {
if (!wincap.has_security () || gid == myself->gid) debug_printf ("new egid: %u current: %u", gid, myself->gid);
return 0;
if (gid == ILLEGAL_GID) if (gid == myself->gid || !wincap.has_security ())
{ {
set_errno (EINVAL); myself->gid = gid;
return -1; return 0;
} }
sigframe thisframe (mainthread); sigframe thisframe (mainthread);
user_groups * groups = &cygheap->user.groups; user_groups * groups = &cygheap->user.groups;
cygsid gsid; cygsid gsid;
HANDLE ptok; HANDLE ptok;
struct __group32 * gr = internal_getgrgid (gid); struct __group32 * gr = internal_getgrgid (gid);
if (!gr || gr->gr_gid != gid || !gsid.getfromgr (gr))
if (!gsid.getfromgr (gr))
{ {
set_errno (EINVAL); set_errno (EINVAL);
return -1; return -1;

View File

@ -102,15 +102,18 @@ internal_getlogin (cygheap_user &user)
void void
uinfo_init () uinfo_init ()
{ {
if (!child_proc_info) if (!child_proc_info || cygheap->user.token != INVALID_HANDLE_VALUE)
internal_getlogin (cygheap->user); /* Set the cygheap->user. */ {
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. */ /* Real and effective uid/gid are identical on process start up. */
cygheap->user.orig_uid = cygheap->user.real_uid = myself->uid; cygheap->user.orig_uid = cygheap->user.real_uid = myself->uid;
cygheap->user.orig_gid = cygheap->user.real_gid = myself->gid; 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 * 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); debug_printf ("HOME is already in the environment %s", p);
else else
{ {
if (!pw)
pw = internal_getpwnam (name ());
if (pw && pw->pw_dir && *pw->pw_dir) if (pw && pw->pw_dir && *pw->pw_dir)
{ {
debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir); debug_printf ("Set HOME (from /etc/passwd) to %s", pw->pw_dir);