* syscalls.cc (setuid): Allow switching user context after

successful call to ImpersonateLogedOnUser (NT only).
	(setgid): Ditto.
	(seteuid): Call setuid.
	(setegid): Call setgid.
This commit is contained in:
Corinna Vinschen 2000-04-19 22:33:20 +00:00
parent ceba50edbe
commit f06a3648d5
2 changed files with 58 additions and 12 deletions

View File

@ -1,3 +1,11 @@
Wed Apr 20 0:19:00 2000 Corinna Vinschen <corinna@vinschen.de>
* syscalls.cc (setuid): Allow switching user context after
successful call to ImpersonateLogedOnUser (NT only).
(setgid): Ditto.
(seteuid): Call setuid.
(setegid): Call setgid.
Wed Apr 19 22:00:00 2000 Corinna Vinschen <corinna@vinschen.de> Wed Apr 19 22:00:00 2000 Corinna Vinschen <corinna@vinschen.de>
* uinfo.cc (internal_getlogin): Use NetGetDCName() instead * uinfo.cc (internal_getlogin): Use NetGetDCName() instead

View File

@ -1689,21 +1689,61 @@ mknod ()
} }
/* setgid: POSIX 4.2.2.1 */ /* setgid: POSIX 4.2.2.1 */
/* FIXME: unimplemented! */
extern "C" extern "C"
int int
setgid (gid_t) setgid (gid_t gid)
{ {
if (os_being_run == winNT)
{
if (gid != (gid_t) -1)
{
if (!getgrgid (gid))
{
set_errno (EINVAL);
return -1;
}
myself->gid = gid;
}
}
else
set_errno (ENOSYS); set_errno (ENOSYS);
return 0; return 0;
} }
extern char *internal_getlogin (struct pinfo *pi);
/* setuid: POSIX 4.2.2.1 */ /* setuid: POSIX 4.2.2.1 */
/* FIXME: unimplemented! */
extern "C" extern "C"
int int
setuid (uid_t) setuid (uid_t uid)
{ {
if (os_being_run == winNT)
{
if (uid != (uid_t) -1)
{
struct passwd *pw_new = getpwuid (uid);
if (!pw_new)
{
set_errno (EINVAL);
return -1;
}
struct pinfo pi;
pi.psid = (PSID) pi.sidbuf;
struct passwd *pw_cur = getpwnam (internal_getlogin (&pi));
if (pw_cur != pw_new)
{
set_errno (EPERM);
return -1;
}
myself->uid = uid;
strcpy (myself->username, pi.username);
CopySid (40, myself->psid, pi.psid);
strcpy (myself->logsrv, pi.logsrv);
strcpy (myself->domain, pi.domain);
}
}
else
set_errno (ENOSYS); set_errno (ENOSYS);
return 0; return 0;
} }
@ -1711,19 +1751,17 @@ setuid (uid_t)
/* seteuid: standards? */ /* seteuid: standards? */
extern "C" extern "C"
int int
seteuid (uid_t) seteuid (uid_t uid)
{ {
set_errno (ENOSYS); return setuid (uid);
return 0;
} }
/* setegid: from System V. */ /* setegid: from System V. */
extern "C" extern "C"
int int
setegid (gid_t) setegid (gid_t gid)
{ {
set_errno (ENOSYS); return setgid (gid);
return 0;
} }
/* chroot: privileged Unix system call. */ /* chroot: privileged Unix system call. */