From f06a3648d543c404968edde157414ce3ee6a8770 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 19 Apr 2000 22:33:20 +0000 Subject: [PATCH] * syscalls.cc (setuid): Allow switching user context after successful call to ImpersonateLogedOnUser (NT only). (setgid): Ditto. (seteuid): Call setuid. (setegid): Call setgid. --- winsup/cygwin/ChangeLog | 8 +++++ winsup/cygwin/syscalls.cc | 62 +++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3383b28e9..a9df3b7e3 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +Wed Apr 20 0:19:00 2000 Corinna Vinschen + + * 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 * uinfo.cc (internal_getlogin): Use NetGetDCName() instead diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index ca9777f79..23faca911 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1689,41 +1689,79 @@ mknod () } /* setgid: POSIX 4.2.2.1 */ -/* FIXME: unimplemented! */ extern "C" int -setgid (gid_t) +setgid (gid_t gid) { - set_errno (ENOSYS); + 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); return 0; } +extern char *internal_getlogin (struct pinfo *pi); + /* setuid: POSIX 4.2.2.1 */ -/* FIXME: unimplemented! */ extern "C" int -setuid (uid_t) +setuid (uid_t uid) { - set_errno (ENOSYS); + 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); return 0; } /* seteuid: standards? */ extern "C" int -seteuid (uid_t) +seteuid (uid_t uid) { - set_errno (ENOSYS); - return 0; + return setuid (uid); } /* setegid: from System V. */ extern "C" int -setegid (gid_t) +setegid (gid_t gid) { - set_errno (ENOSYS); - return 0; + return setgid (gid); } /* chroot: privileged Unix system call. */ -- 2.43.5