Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2002-05-29 19:04:29 +0400
committerCorinna Vinschen <corinna@vinschen.de>2002-05-29 19:04:29 +0400
commita8d7ae61e7b832d354731b1d024e4ff1ed22fca0 (patch)
tree177816378230c384a5d6b375fc5e5b42478e06c2
parent9854c44c43a179a550c2fb4d23a7f97332628ed3 (diff)
Change internal uid datatype from __uid16_t to __uid32_t
throughout. * cygwin.din: Export new symbols getpwuid32, getpwuid_r32, getuid32, geteuid32, setuid32, seteuid32. * passwd.cc (getpwuid32): New function. (getpwuid_r32): Ditto. * syscalls.cc (seteuid32): Ditto. (setuid32): Ditto. * uinfo.cc (getuid32): Ditto. (geteuid32): Ditto. * winsup.h (uid16touid32): New macro, correclt casting from __uid16_t to __uid32_t. (gid16togid32): Ditto fir gids. (getuid32): Declare. (geteuid32): Ditto. (getpwuid32): Ditto. * include/sys/cygwin.h (struct external_pinfo): Add members uid32 and gid32.
-rw-r--r--winsup/cygwin/ChangeLog21
-rw-r--r--winsup/cygwin/child_info.h2
-rw-r--r--winsup/cygwin/cygheap.h4
-rw-r--r--winsup/cygwin/cygwin.din6
-rw-r--r--winsup/cygwin/external.cc3
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc4
-rw-r--r--winsup/cygwin/include/sys/cygwin.h5
-rw-r--r--winsup/cygwin/passwd.cc20
-rw-r--r--winsup/cygwin/sec_acl.cc6
-rw-r--r--winsup/cygwin/sec_helper.cc4
-rw-r--r--winsup/cygwin/security.cc18
-rw-r--r--winsup/cygwin/security.h6
-rw-r--r--winsup/cygwin/shm.cc6
-rw-r--r--winsup/cygwin/spawn.cc2
-rw-r--r--winsup/cygwin/syscalls.cc60
-rw-r--r--winsup/cygwin/uinfo.cc12
-rw-r--r--winsup/cygwin/winsup.h11
17 files changed, 135 insertions, 55 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 6edb59107..e2e1ee4b6 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,26 @@
2002-05-29 Corinna Vinschen <corinna@vinschen.de>
+ Change internal uid datatype from __uid16_t to __uid32_t
+ throughout.
+ * cygwin.din: Export new symbols getpwuid32, getpwuid_r32, getuid32,
+ geteuid32, setuid32, seteuid32.
+ * passwd.cc (getpwuid32): New function.
+ (getpwuid_r32): Ditto.
+ * syscalls.cc (seteuid32): Ditto.
+ (setuid32): Ditto.
+ * uinfo.cc (getuid32): Ditto.
+ (geteuid32): Ditto.
+ * winsup.h (uid16touid32): New macro, correclt casting from __uid16_t
+ to __uid32_t.
+ (gid16togid32): Ditto fir gids.
+ (getuid32): Declare.
+ (geteuid32): Ditto.
+ (getpwuid32): Ditto.
+ * include/sys/cygwin.h (struct external_pinfo): Add members uid32 and
+ gid32.
+
+2002-05-29 Corinna Vinschen <corinna@vinschen.de>
+
* include/cygwin/socket.h: Protect some symbols against multiple
definition.
* include/netinet/ip.h: Ditto.
diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h
index e79ca3947..fdfaa28ca 100644
--- a/winsup/cygwin/child_info.h
+++ b/winsup/cygwin/child_info.h
@@ -70,7 +70,7 @@ class fhandler_base;
class cygheap_exec_info
{
public:
- __uid16_t uid;
+ __uid32_t uid;
char *old_title;
int argc;
char **argv;
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index aa4e525ab..f4ef14459 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -96,9 +96,9 @@ class cygheap_user
PSID psid; /* buffer for user's SID */
PSID orig_psid; /* Remains intact even after impersonation */
public:
- __uid16_t orig_uid; /* Remains intact even after impersonation */
+ __uid32_t orig_uid; /* Remains intact even after impersonation */
__gid32_t orig_gid; /* Ditto */
- __uid16_t real_uid; /* Remains intact on seteuid, replaced by setuid */
+ __uid32_t real_uid; /* Remains intact on seteuid, replaced by setuid */
__gid32_t real_gid; /* Ditto */
/* token is needed if set(e)uid should be called. It can be set by a call
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
index 1d8ae0b81..ccea8797c 100644
--- a/winsup/cygwin/cygwin.din
+++ b/winsup/cygwin/cygwin.din
@@ -349,6 +349,7 @@ _getegid = getegid
getegid32
geteuid
_geteuid = geteuid
+geteuid32
getgid
_getgid = getgid
getgid32
@@ -389,6 +390,7 @@ gettimeofday
_gettimeofday = gettimeofday
getuid
_getuid = getuid
+getuid32
getutent
_getutent = getutent
getutid
@@ -682,11 +684,13 @@ settimeofday
_settimeofday = settimeofday
seteuid
_seteuid = seteuid
+seteuid32
setegid
_setegid = setegid
setegid32
setuid
_setuid = setuid
+setuid32
setutent
_setutent = setutent
chroot
@@ -1019,7 +1023,9 @@ _getpwnam = getpwnam
getpwnam_r
getpwuid
_getpwuid = getpwuid
+getpwuid32
getpwuid_r
+getpwuid_r32
getpgrp
_getpgrp = getpgrp
getgrent
diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc
index 3cbf9c0b2..8a06f0261 100644
--- a/winsup/cygwin/external.cc
+++ b/winsup/cygwin/external.cc
@@ -86,6 +86,9 @@ fillout_pinfo (pid_t pid, int winpid)
ep.strace_file = 0;
ep.process_state = p->process_state;
+
+ ep.uid32 = p->uid;
+ ep.gid32 = p->gid;
break;
}
}
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index de8476445..c4474f184 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -126,7 +126,7 @@ fhandler_disk_file::fstat (struct __stat64 *buf, path_conv *pc)
{
int res = -1;
int oret;
- __uid16_t uid;
+ __uid32_t uid;
__gid32_t gid;
int open_flags = O_RDONLY | O_BINARY | O_DIROPEN;
bool query_open_already;
@@ -237,7 +237,7 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc,
else if (pc->issocket ())
buf->st_mode = S_IFSOCK;
- __uid16_t uid;
+ __uid32_t uid;
__gid32_t gid;
if (get_file_attribute (pc->has_acls (), get_win32_name (), &buf->st_mode,
&uid, &gid) == 0)
diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h
index 38e3cb316..90cd07514 100644
--- a/winsup/cygwin/include/sys/cygwin.h
+++ b/winsup/cygwin/include/sys/cygwin.h
@@ -211,6 +211,8 @@ extern int cygwin_attach_handle_to_fd (char *, int, HANDLE, mode_t, DWORD);
#ifndef _SYS_TYPES_H
typedef unsigned short __uid16_t;
typedef unsigned short __gid16_t;
+typedef unsigned long __uid32_t;
+typedef unsigned long __gid32_t;
#endif
struct external_pinfo
@@ -236,6 +238,9 @@ struct external_pinfo
HANDLE strace_file;
DWORD process_state;
+
+ __uid32_t uid32;
+ __gid32_t gid32;
};
DWORD cygwin_internal (cygwin_getinfo_types, ...);
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index 744fcd652..c526dd293 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -186,7 +186,7 @@ read_etc_passwd ()
/* Cygwin internal */
/* If this ever becomes non-reentrant, update all the getpw*_r functions */
static struct passwd *
-search_for (__uid16_t uid, const char *name)
+search_for (__uid32_t uid, const char *name)
{
struct passwd *res = 0;
struct passwd *default_pw = 0;
@@ -202,7 +202,7 @@ search_for (__uid16_t uid, const char *name)
if (strcasematch (name, res->pw_name))
return res;
}
- else if (uid == res->pw_uid)
+ else if (uid == (__uid32_t) res->pw_uid)
return res;
}
@@ -217,7 +217,7 @@ search_for (__uid16_t uid, const char *name)
}
extern "C" struct passwd *
-getpwuid (__uid16_t uid)
+getpwuid32 (__uid32_t uid)
{
if (passwd_state <= initializing)
read_etc_passwd ();
@@ -227,8 +227,14 @@ getpwuid (__uid16_t uid)
return search_for (uid, 0);
}
+extern "C" struct passwd *
+getpwuid (__uid16_t uid)
+{
+ return getpwuid32 (uid16touid32 (uid));
+}
+
extern "C" int
-getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
+getpwuid_r32 (__uid32_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
{
*result = NULL;
@@ -269,6 +275,12 @@ getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, str
return 0;
}
+extern "C" int
+getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
+{
+ return getpwuid_r32 (uid16touid32 (uid), pwd, buffer, bufsize, result);
+}
+
extern "C" struct passwd *
getpwnam (const char *name)
{
diff --git a/winsup/cygwin/sec_acl.cc b/winsup/cygwin/sec_acl.cc
index 47f1cb426..71a0147e8 100644
--- a/winsup/cygwin/sec_acl.cc
+++ b/winsup/cygwin/sec_acl.cc
@@ -158,7 +158,7 @@ setacl (const char *file, int nentries, __aclent16_t *aclbufp)
break;
case USER:
case DEF_USER:
- if (!(pw = getpwuid (aclbufp[i].a_id))
+ if (!(pw = getpwuid32 (aclbufp[i].a_id))
|| !sid.getfrompw (pw)
|| !add_access_allowed_ace (acl, ace_off++, allow,
sid, acl_len, inheritance))
@@ -255,7 +255,7 @@ getacl (const char *file, DWORD attr, int nentries, __aclent16_t *aclbufp)
PSID owner_sid;
PSID group_sid;
BOOL dummy;
- __uid16_t uid;
+ __uid32_t uid;
__gid32_t gid;
if (!GetSecurityDescriptorOwner (psd, &owner_sid, &dummy))
@@ -426,7 +426,7 @@ acl_access (const char *path, int flags)
struct passwd *pw;
struct __group32 *gr = NULL;
- if ((pw = getpwuid (acls[i].a_id)) != NULL
+ if ((pw = getpwuid32 (acls[i].a_id)) != NULL
&& owner.getfrompw (pw))
{
for (int gidx = 0; (gr = internal_getgrent (gidx)); ++gidx)
diff --git a/winsup/cygwin/sec_helper.cc b/winsup/cygwin/sec_helper.cc
index c5341128f..603796a9f 100644
--- a/winsup/cygwin/sec_helper.cc
+++ b/winsup/cygwin/sec_helper.cc
@@ -244,7 +244,7 @@ cygsid::get_id (BOOL search_grp, int *type)
}
}
if (id == -1)
- id = getuid ();
+ id = getuid32 ();
return id;
}
@@ -254,7 +254,7 @@ is_grp_member (__uid32_t uid, __gid32_t gid)
extern int getgroups32 (int, __gid32_t *, __gid32_t, const char *);
BOOL grp_member = TRUE;
- struct passwd *pw = getpwuid (uid);
+ struct passwd *pw = getpwuid32 (uid);
__gid32_t grps[NGROUPS_MAX];
int cnt = getgroups32 (NGROUPS_MAX, grps,
pw ? pw->pw_gid : myself->gid,
diff --git a/winsup/cygwin/security.cc b/winsup/cygwin/security.cc
index 58b10c844..819a33bc1 100644
--- a/winsup/cygwin/security.cc
+++ b/winsup/cygwin/security.cc
@@ -1130,7 +1130,7 @@ write_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size)
static int
get_nt_attribute (const char *file, int *attribute,
- __uid16_t *uidret, __gid32_t *gidret)
+ __uid32_t *uidret, __gid32_t *gidret)
{
if (!wincap.has_security ())
return 0;
@@ -1168,7 +1168,7 @@ get_nt_attribute (const char *file, int *attribute,
return -1;
}
- __uid16_t uid = cygsid(owner_sid).get_uid ();
+ __uid32_t uid = cygsid(owner_sid).get_uid ();
__gid32_t gid = cygsid(group_sid).get_gid ();
if (uidret)
*uidret = uid;
@@ -1279,7 +1279,7 @@ get_nt_attribute (const char *file, int *attribute,
int
get_file_attribute (int use_ntsec, const char *file,
- int *attribute, __uid16_t *uidret, __gid32_t *gidret)
+ int *attribute, __uid32_t *uidret, __gid32_t *gidret)
{
int res;
@@ -1292,7 +1292,7 @@ get_file_attribute (int use_ntsec, const char *file,
}
if (uidret)
- *uidret = getuid ();
+ *uidret = getuid32 ();
if (gidret)
*gidret = getgid32 ();
@@ -1350,7 +1350,7 @@ add_access_denied_ace (PACL acl, int offset, DWORD attributes,
}
PSECURITY_DESCRIPTOR
-alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
+alloc_sd (__uid32_t uid, __gid32_t gid, const char *logsrv, int attribute,
PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret)
{
BOOL dummy;
@@ -1367,7 +1367,7 @@ alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
/* Get SID and name of new owner. */
char owner[UNLEN + 1];
cygsid owner_sid;
- struct passwd *pw = getpwuid (uid);
+ struct passwd *pw = getpwuid32 (uid);
strcpy (owner, pw ? pw->pw_name : getlogin ());
if ((!pw || !owner_sid.getfrompw (pw))
&& !lookup_name (owner, logsrv, owner_sid))
@@ -1612,14 +1612,14 @@ set_security_attribute (int attribute, PSECURITY_ATTRIBUTES psa,
psa->lpSecurityDescriptor = sd_buf;
InitializeSecurityDescriptor ((PSECURITY_DESCRIPTOR)sd_buf,
SECURITY_DESCRIPTOR_REVISION);
- psa->lpSecurityDescriptor = alloc_sd (geteuid (), getegid32 (),
+ psa->lpSecurityDescriptor = alloc_sd (geteuid32 (), getegid32 (),
cygheap->user.logsrv (),
attribute, (PSECURITY_DESCRIPTOR)sd_buf,
&sd_buf_size);
}
static int
-set_nt_attribute (const char *file, __uid16_t uid, __gid32_t gid,
+set_nt_attribute (const char *file, __uid32_t uid, __gid32_t gid,
const char *logsrv, int attribute)
{
if (!wincap.has_security ())
@@ -1645,7 +1645,7 @@ set_nt_attribute (const char *file, __uid16_t uid, __gid32_t gid,
int
set_file_attribute (int use_ntsec, const char *file,
- __uid16_t uid, __gid32_t gid,
+ __uid32_t uid, __gid32_t gid,
int attribute, const char *logsrv)
{
int ret = 0;
diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h
index db3df2901..183b84394 100644
--- a/winsup/cygwin/security.h
+++ b/winsup/cygwin/security.h
@@ -166,9 +166,9 @@ extern struct __group32 *internal_getgrent (int);
/* File manipulation */
int __stdcall set_process_privileges ();
int __stdcall get_file_attribute (int, const char *, int *,
- __uid16_t * = NULL, __gid32_t * = NULL);
+ __uid32_t * = NULL, __gid32_t * = NULL);
int __stdcall set_file_attribute (int, const char *, int);
-int __stdcall set_file_attribute (int, const char *, __uid16_t, __gid32_t, int, const char *);
+int __stdcall set_file_attribute (int, const char *, __uid32_t, __gid32_t, int, const char *);
LONG __stdcall read_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, LPDWORD sd_size);
LONG __stdcall write_sd(const char *file, PSECURITY_DESCRIPTOR sd_buf, DWORD sd_size);
BOOL __stdcall add_access_allowed_ace (PACL acl, int offset, DWORD attributes, PSID sid, size_t &len_add, DWORD inherit);
@@ -209,7 +209,7 @@ extern BOOL sec_acl (PACL acl, BOOL admins, PSID sid1 = NO_SID, PSID sid2 = NO_S
int __stdcall NTReadEA (const char *file, const char *attrname, char *buf, int len);
BOOL __stdcall NTWriteEA (const char *file, const char *attrname, const char *buf, int len);
-PSECURITY_DESCRIPTOR alloc_sd (__uid16_t uid, __gid32_t gid, const char *logsrv, int attribute,
+PSECURITY_DESCRIPTOR alloc_sd (__uid32_t uid, __gid32_t gid, const char *logsrv, int attribute,
PSECURITY_DESCRIPTOR sd_ret, DWORD *sd_size_ret);
extern inline SECURITY_ATTRIBUTES *
diff --git a/winsup/cygwin/shm.cc b/winsup/cygwin/shm.cc
index 8a32efb66..647c55dfe 100644
--- a/winsup/cygwin/shm.cc
+++ b/winsup/cygwin/shm.cc
@@ -442,7 +442,7 @@ shmctl (int shmid, int cmd, struct shmid_ds *buf)
return 0;
}
-/* FIXME: evaluate getuid() and getgid32() against the requested mode. Then
+/* FIXME: evaluate getuid32() and getgid32() against the requested mode. Then
* choose PAGE_READWRITE | PAGE_READONLY and FILE_MAP_WRITE | FILE_MAP_READ
* appropriately
*/
@@ -461,7 +461,7 @@ shmget (key_t key, size_t size, int shmflg)
/* create a sd for our open requests based on shmflag & 0x01ff */
InitializeSecurityDescriptor (psd,
SECURITY_DESCRIPTOR_REVISION);
- psd = alloc_sd (getuid (), getgid32 (), cygheap->user.logsrv (),
+ psd = alloc_sd (getuid32 (), getgid32 (), cygheap->user.logsrv (),
shmflg & 0x01ff, psd, &sd_size);
if (key == (key_t) - 1)
@@ -538,7 +538,7 @@ shmget (key_t key, size_t size, int shmflg)
#if 0
/* fill out the node data */
- shmtemp->shm_perm.cuid = getuid ();
+ shmtemp->shm_perm.cuid = getuid32 ();
shmtemp->shm_perm.uid = shmtemp->shm_perm.cuid;
shmtemp->shm_perm.cgid = getgid32 ();
shmtemp->shm_perm.gid = shmtemp->shm_perm.cgid;
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index b18d7b47d..5b110548b 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -627,7 +627,7 @@ spawn_guts (HANDLE hToken, const char * prog_arg, const char *const *argv,
cygbench ("spawn-guts");
if (!hToken)
{
- ciresrv.moreinfo->uid = getuid ();
+ ciresrv.moreinfo->uid = getuid32 ();
/* FIXME: This leaks a handle in the CreateProcessAsUser case since the
child process doesn't know about cygwin_mount_h. */
ciresrv.mount_h = cygwin_mount_h;
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index afdc457e9..969389f31 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -750,10 +750,10 @@ done:
* systems, it is only a stub that always returns zero.
*/
static int
-chown_worker (const char *name, unsigned fmode, __uid16_t uid, __gid32_t gid)
+chown_worker (const char *name, unsigned fmode, __uid32_t uid, __gid32_t gid)
{
int res;
- __uid16_t old_uid;
+ __uid32_t old_uid;
__gid32_t old_gid;
if (check_null_empty_str_errno (name))
@@ -815,7 +815,7 @@ done:
}
extern "C" int
-chown32 (const char * name, __uid16_t uid, __gid32_t gid)
+chown32 (const char * name, __uid32_t uid, __gid32_t gid)
{
sigframe thisframe (mainthread);
return chown_worker (name, PC_SYM_FOLLOW, uid, gid);
@@ -825,11 +825,11 @@ extern "C" int
chown (const char * name, __uid16_t uid, __gid16_t gid)
{
sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_FOLLOW, uid, (__gid32_t) gid);
+ return chown_worker (name, PC_SYM_FOLLOW, uid, gid16togid32 (gid));
}
extern "C" int
-lchown32 (const char * name, __uid16_t uid, __gid32_t gid)
+lchown32 (const char * name, __uid32_t uid, __gid32_t gid)
{
sigframe thisframe (mainthread);
return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid);
@@ -839,11 +839,11 @@ extern "C" int
lchown (const char * name, __uid16_t uid, __gid16_t gid)
{
sigframe thisframe (mainthread);
- return chown_worker (name, PC_SYM_NOFOLLOW, uid, (__gid32_t) gid);
+ return chown_worker (name, PC_SYM_NOFOLLOW, uid, gid16togid32 (gid));
}
extern "C" int
-fchown32 (int fd, __uid16_t uid, __gid32_t gid)
+fchown32 (int fd, __uid32_t uid, __gid32_t gid)
{
sigframe thisframe (mainthread);
cygheap_fdget cfd (fd);
@@ -870,7 +870,7 @@ fchown32 (int fd, __uid16_t uid, __gid32_t gid)
extern "C" int
fchown (int fd, __uid16_t uid, __gid16_t gid)
{
- return fchown32 (fd, uid, (__gid32_t) gid);
+ return fchown32 (fd, uid, gid16togid32 (gid));
}
/* umask: POSIX 5.3.3.1 */
@@ -914,7 +914,7 @@ chmod (const char *path, mode_t mode)
/* temporary erase read only bit, to be able to set file security */
SetFileAttributes (win32_path, (DWORD) win32_path & ~FILE_ATTRIBUTE_READONLY);
- __uid16_t uid;
+ __uid32_t uid;
__gid32_t gid;
if (win32_path.isdir ())
@@ -1932,22 +1932,11 @@ mkfifo (const char *_path, mode_t mode)
return -1;
}
-/* setuid: POSIX 4.2.2.1 */
-extern "C" int
-setuid (__uid16_t uid)
-{
- int ret = seteuid (uid);
- if (!ret)
- cygheap->user.real_uid = myself->uid;
- debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid);
- return ret;
-}
-
extern struct passwd *internal_getlogin (cygheap_user &user);
/* seteuid: standards? */
extern "C" int
-seteuid (__uid16_t uid)
+seteuid32 (__uid32_t uid)
{
if (!wincap.has_security ()) return 0;
@@ -1974,7 +1963,7 @@ seteuid (__uid16_t uid)
debug_printf ("uid: %d myself->gid: %d", uid, myself->gid);
- pw_new = getpwuid (uid);
+ pw_new = getpwuid32 (uid);
if (!usersid.getfrompw (pw_new) ||
(!pgrpsid.getfromgr (getgrgid32 (myself->gid))))
{
@@ -2145,6 +2134,29 @@ seteuid (__uid16_t uid)
return -1;
}
+extern "C" int
+seteuid (__uid16_t uid)
+{
+ return seteuid32 (uid16touid32 (uid));
+}
+
+/* setuid: POSIX 4.2.2.1 */
+extern "C" int
+setuid32 (__uid32_t uid)
+{
+ int ret = seteuid32 (uid);
+ if (!ret)
+ cygheap->user.real_uid = myself->uid;
+ debug_printf ("real: %d, effective: %d", cygheap->user.real_uid, myself->uid);
+ return ret;
+}
+
+extern "C" int
+setuid (__uid16_t uid)
+{
+ return setuid32 (uid16touid32 (uid));
+}
+
/* setegid: from System V. */
extern "C" int
setegid32 (__gid32_t gid)
@@ -2197,7 +2209,7 @@ setegid32 (__gid32_t gid)
extern "C" int
setegid (__gid16_t gid)
{
- return setegid32 ((__gid32_t) gid);
+ return setegid32 (gid16togid32 (gid));
}
/* setgid: POSIX 4.2.2.1 */
@@ -2213,7 +2225,7 @@ setgid32 (__gid32_t gid)
extern "C" int
setgid (__gid16_t gid)
{
- int ret = setegid32 ((__gid32_t) gid);
+ int ret = setegid32 (gid16togid32 (gid));
if (!ret)
cygheap->user.real_gid = myself->gid;
return ret;
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index b851b384d..5f6a5d25d 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -282,6 +282,12 @@ getlogin (void)
return strcpy (this_username, cygheap->user.name ());
}
+extern "C" __uid32_t
+getuid32 (void)
+{
+ return cygheap->user.real_uid;
+}
+
extern "C" __uid16_t
getuid (void)
{
@@ -300,6 +306,12 @@ getgid (void)
return cygheap->user.real_gid;
}
+extern "C" __uid32_t
+geteuid32 (void)
+{
+ return myself->uid;
+}
+
extern "C" __uid16_t
geteuid (void)
{
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
index 69d5938ae..c153e91b6 100644
--- a/winsup/cygwin/winsup.h
+++ b/winsup/cygwin/winsup.h
@@ -147,10 +147,19 @@ extern "C" void __stdcall do_exit (int) __attribute__ ((noreturn));
/* UID/GID */
void uinfo_init (void);
-#define ILLEGAL_UID ((__uid16_t)-1)
+#define ILLEGAL_UID16 ((__uid16_t)-1)
+#define ILLEGAL_UID ((__uid32_t)-1)
+#define ILLEGAL_GID16 ((__gid16_t)-1)
#define ILLEGAL_GID ((__gid32_t)-1)
#define ILLEGAL_SEEK ((__off64_t)-1)
+#define uid16touid32(u16) ((u16)==ILLEGAL_UID16?ILLEGAL_UID:(__uid32_t)(u16))
+#define gid16togid32(g16) ((g16)==ILLEGAL_GID16?ILLEGAL_GID:(__gid32_t)(g16))
+
+extern "C" __uid32_t getuid32 (void);
+extern "C" __uid32_t geteuid32 (void);
+extern "C" struct passwd *getpwuid32 (__uid32_t);
+
/* various events */
void events_init (void);
void events_terminate (void);