From: Jakub Jelinek <jakub@redhat.com>
To: Ulrich Drepper <drepper@redhat.com>, Roland McGrath <roland@redhat.com>
Cc: Glibc hackers <libc-hacker@sources.redhat.com>
Subject: [PATCH] set{r,}e[ug]id fixes
Date: Mon, 09 Jun 2003 15:53:00 -0000 [thread overview]
Message-ID: <20030609155332.GN24872@sunsite.ms.mff.cuni.cz> (raw)
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
next reply other threads:[~2003-06-09 15:53 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-06-09 15:53 Jakub Jelinek [this message]
2003-06-10 2:31 ` Ulrich Drepper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030609155332.GN24872@sunsite.ms.mff.cuni.cz \
--to=jakub@redhat.com \
--cc=drepper@redhat.com \
--cc=libc-hacker@sources.redhat.com \
--cc=roland@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).