* [PATCH] set{r,}e[ug]id fixes
@ 2003-06-09 15:53 Jakub Jelinek
2003-06-10 2:31 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2003-06-09 15:53 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath; +Cc: Glibc hackers
Hi!
I cannot find in POSIX 2003 any word about setre[ug]id not touching saved ID
(unlike sete[ug]id). Solaris man page on the other side says for setregid:
"In either case, if the real group ID is being changed (that
is, if rgid is not -1), or the effective group ID is being
changed to a value not equal to the real group ID, the saved
set-group-ID is set equal to the new effective group ID."
Also, even with __ASSUME_32BITUIDS > 0 setres[ug]id32 syscalls might not be
defined (ppc, mips) and setresgid syscall was introduced on most arches
later than setresuid, so if __ASSUME_SETRESUID_SYSCALL is used, glibc
configured for kernels in between setresuid and setresgid additions wouldn't
work on those kernels properly.
2003-06-09 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/kernel-features.h
(__ASSUME_SETRESGID_SYSCALL): Define.
* sysdeps/unix/sysv/linux/setegid.c: Use __ASSUME_SETRESGID_SYSCALL
instead of __ASSUME_SETRESUID_SYSCALL.
(setegid): Only use setresgid32 inline syscall if __NR_setresgid32 is
defined.
* sysdeps/unix/sysv/linux/seteuid.c (seteuid): Only use setresgid32
inline syscall if __NR_setresuid32 is defined.
* sysdeps/unix/sysv/linux/i386/setegid.c (setegid): Use
__ASSUME_SETRESGID_SYSCALL instead of __ASSUME_SETRESUID_SYSCALL.
* sysdeps/unix/sysv/linux/i386/setregid.c: Backout last changes.
* sysdeps/unix/sysv/linux/i386/setreuid.c: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c (setegid): Protect
code handling non-existant setresgid32 syscall with
#if __ASSUME_SETRESGID_SYSCALL == 0.
--- libc/sysdeps/unix/sysv/linux/kernel-features.h 26 May 2003 02:44:18 -0000 1.51
+++ libc/sysdeps/unix/sysv/linux/kernel-features.h 9 Jun 2003 15:26:52 -0000
@@ -127,6 +127,10 @@
# define __ASSUME_SETRESUID_SYSCALL 1
#endif
+#if __LINUX_KERNEL_VERSION >= 131879
+# define __ASSUME_SETRESGID_SYSCALL 1
+#endif
+
/* Linux 2.3.39 introduced IPC64. Except for powerpc. */
#if __LINUX_KERNEL_VERSION >= 131879 && !defined __powerpc__
# define __ASSUME_IPC64 1
--- libc/sysdeps/unix/sysv/linux/setegid.c 8 Jun 2003 22:36:33 -0000 1.5
+++ libc/sysdeps/unix/sysv/linux/setegid.c 9 Jun 2003 15:26:52 -0000
@@ -24,7 +24,7 @@
#include <sysdep.h>
#include "kernel-features.h"
-#if defined __NR_setresgid || __ASSUME_SETRESUID_SYSCALL > 0
+#if defined __NR_setresgid || __ASSUME_SETRESGID_SYSCALL > 0
extern int __setresgid (gid_t rgid, gid_t egid, gid_t sgid);
@@ -39,12 +39,12 @@ setegid (gid_t gid)
return -1;
}
-# if __ASSUME_32BITUIDS > 0
+# if __ASSUME_32BITUIDS > 0 && defined __NR_setresgid32
return INLINE_SYSCALL (setresgid32, 3, -1, gid, -1);
# else
/* First try the syscall. */
result = __setresgid (-1, gid, -1);
-# if __ASSUME_SETRESUID_SYSCALL == 0
+# if __ASSUME_SETRESGID_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use emulation. This may not work
since `setregid' also sets the saved group ID when GID is not
--- libc/sysdeps/unix/sysv/linux/seteuid.c 8 Jun 2003 22:37:07 -0000 1.8
+++ libc/sysdeps/unix/sysv/linux/seteuid.c 9 Jun 2003 15:26:52 -0000
@@ -39,7 +39,7 @@ seteuid (uid_t uid)
return -1;
}
-# if __ASSUME_32BITUIDS > 0
+# if __ASSUME_32BITUIDS > 0 && defined __NR_setresuid32
return INLINE_SYSCALL (setresuid32, 3, -1, uid, -1);
# else
/* First try the syscall. */
--- libc/sysdeps/unix/sysv/linux/i386/setegid.c 8 Jun 2003 22:34:51 -0000 1.5
+++ libc/sysdeps/unix/sysv/linux/i386/setegid.c 9 Jun 2003 15:26:52 -0000
@@ -39,7 +39,7 @@ setegid (gid)
/* First try the syscall. */
# ifdef __NR_setresgid
result = __setresgid (-1, gid, -1);
-# if __ASSUME_SETRESUID_SYSCALL > 0
+# if __ASSUME_SETRESGID_SYSCALL > 0
if (0)
# else
if (result == -1 && errno == ENOSYS)
--- libc/sysdeps/unix/sysv/linux/i386/setregid.c 8 Jun 2003 20:38:42 -0000 1.8
+++ libc/sysdeps/unix/sysv/linux/i386/setregid.c 9 Jun 2003 15:26:52 -0000
@@ -42,15 +42,15 @@ int
__setregid (gid_t rgid, gid_t egid)
{
#if __ASSUME_32BITUIDS > 0
- return INLINE_SYSCALL (setresgid32, 3, rgid, egid, -1);
+ return INLINE_SYSCALL (setregid32, 2, rgid, egid);
#else
-# ifdef __NR_setresgid32
+# ifdef __NR_setregid32
if (__libc_missing_32bit_uids <= 0)
{
int result;
int saved_errno = errno;
- result = INLINE_SYSCALL (setresgid32, 3, rgid, egid, -1);
+ result = INLINE_SYSCALL (setregid32, 2, rgid, egid);
if (result == 0 || errno != ENOSYS)
return result;
@@ -66,13 +66,7 @@ __setregid (gid_t rgid, gid_t egid)
return -1;
}
-# ifdef __NR_setresgid
- int result = INLINE_SYSCALL (setresgid, 3, rgid, egid, -1);
-# endif
- if (result == -1 && errno == ENOSYS)
- result = INLINE_SYSCALL (setregid, 2, rgid, egid);
-
- return result;
+ return INLINE_SYSCALL (setregid, 2, rgid, egid);
#endif
}
weak_alias (__setregid, setregid)
--- libc/sysdeps/unix/sysv/linux/i386/setreuid.c 8 Jun 2003 20:38:33 -0000 1.8
+++ libc/sysdeps/unix/sysv/linux/i386/setreuid.c 9 Jun 2003 15:26:52 -0000
@@ -42,15 +42,15 @@ int
__setreuid (uid_t ruid, uid_t euid)
{
#if __ASSUME_32BITUIDS > 0
- return INLINE_SYSCALL (setresuid32, 3, ruid, euid, -1);
+ return INLINE_SYSCALL (setreuid32, 2, ruid, euid);
#else
-# ifdef __NR_setresuid32
+# ifdef __NR_setreuid32
if (__libc_missing_32bit_uids <= 0)
{
int result;
int saved_errno = errno;
- result = INLINE_SYSCALL (setresuid32, 3, ruid, euid, -1);
+ result = INLINE_SYSCALL (setreuid32, 2, ruid, euid);
if (result == 0 || errno != ENOSYS)
return result;
@@ -66,13 +66,7 @@ __setreuid (uid_t ruid, uid_t euid)
return -1;
}
-# ifdef __NR_setresuid
- itn result = INLINE_SYSCALL (setresuid, 3, ruid, euid, -1);
-# endif
- if (result == -1 && errno == ENOSYS)
- result = INLINE_SYSCALL (setreuid, 2, ruid, euid);
-
- return result;
+ return INLINE_SYSCALL (setreuid, 2, ruid, euid);
#endif
}
weak_alias (__setreuid, setreuid)
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c 13 Aug 2002 00:22:49 -0000 1.4
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c 9 Jun 2003 15:26:52 -0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -38,11 +38,13 @@ setegid (gid_t gid)
/* First try the syscall. */
result = __setresgid (-1, gid, -1);
+# if __ASSUME_SETRESGID_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use emulation. This may not work
since `setregid' also sets the saved group ID when GID is not
equal to the real group ID, making it impossible to switch back. */
result = __setregid (-1, gid);
+# endif
return result;
}
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] set{r,}e[ug]id fixes
2003-06-09 15:53 [PATCH] set{r,}e[ug]id fixes Jakub Jelinek
@ 2003-06-10 2:31 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2003-06-10 2:31 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Roland McGrath, Glibc hackers
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
I've applied the patch.
- --
- --------------. ,-. 444 Castro Street
Ulrich Drepper \ ,-----------------' \ Mountain View, CA 94041 USA
Red Hat `--' drepper at redhat.com `---------------------------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+5UKx2ijCOnn/RHQRAuyGAJ4l6MSl1dwliyYDGZEZIrX1ehL5AgCcCzH9
717yR10UOGtsPpzRsuR2BwM=
=MNkH
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-06-10 2:31 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-06-09 15:53 [PATCH] set{r,}e[ug]id fixes Jakub Jelinek
2003-06-10 2:31 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).