* 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:
parent
45dbfc2611
commit
4f7e12dd26
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue