This is the mail archive of the
libc-hacker@sourceware.cygnus.com
mailing list for the glibc project.
Fix for seteuid.
- To: libc-hacker@cygnus.com
- Subject: Fix for seteuid.
- From: Mark Kettenis <kettenis@phys.uva.nl>
- Date: 30 Jul 1998 23:21:20 +0200
Hi,
Here is my fix for seteuid. I tested it with linux 2.1.108 and
sendmail is happy with it. As expected linux 2.0.32 doesn't work (it
does not have the setresuid syscall) and shows the same behaviour as
before.
Could someone who understands the syscalls.list format a bit better
than me, look if I did make the right changes?
Mark
1998-07-30 Mark Kettenis <kettenis@phys.uva.nl>
* sysdeps/unix/sysv/linux/syscalls.list: Add __setresuid as real
name for system call and make setresuid a weak alias. Set caller
to seteuid.
* sysdeps/unix/sysv/linux/seteuid.c (seteuid): Implement using
`setresuid' syscall if availble. Fixes problems with sendmail
which expects `seteuid' to not set the saved user ID.
Index: sysdeps/unix/sysv/linux/seteuid.c
--- 0.47/sysdeps/unix/sysv/linux/seteuid.c Thu, 30 Jul 1998 18:25:37 +0200 kettenis (libc/m/33_seteuid.c 1.1 644)
+++ local.77(w)/sysdeps/unix/sysv/linux/seteuid.c Thu, 30 Jul 1998 20:23:48 +0200 kettenis (libc/m/33_seteuid.c 1.2 644)
@@ -1 +1,51 @@
-#include <sysdeps/unix/bsd/seteuid.c>
+/* Copyright (C) 1998 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
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <errno.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#ifdef __NR_setresuid
+
+extern int __setresuid (uid_t ruid, uid_t euid, uid_t suid);
+
+int
+seteuid (uid_t uid)
+{
+ int result;
+
+ if (uid == (uid_t) ~0)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* First try the syscall. */
+ result = __setresuid (-1, uid, -1);
+ if (result == -1 && errno == ENOSYS)
+ /* No system call available. Use emulation. This may not work
+ since `setreuid' also sets the saved user ID when UID is not
+ equal to the real user ID, making it impossible to switch back. */
+ result = __setreuid (-1, uid);
+
+ return result;
+}
+#else
+# include <sysdeps/unix/bsd/seteuid.c>
+#endif
Index: sysdeps/unix/sysv/linux/syscalls.list
--- 0.47/sysdeps/unix/sysv/linux/syscalls.list Thu, 30 Jul 1998 22:58:56 +0200 kettenis (libc/m/34_syscalls.l 1.1 640)
+++ local.77(w)/sysdeps/unix/sysv/linux/syscalls.list Thu, 30 Jul 1998 20:23:30 +0200 kettenis ()
@@ -71,7 +71,7 @@
setfsuid EXTRA setfsuid 1 setfsuid
setpgid - setpgid 2 __setpgid setpgid
setresgid EXTRA setresgid 3 setresgid
-setresuid EXTRA setresuid 3 setresuid
+setresuid seteuid setresuid 3 __setresuid setresuid
sigaltstack - sigaltstack 2 __sigaltstack sigaltstack
sys_fstat fxstat fstat 2 __syscall_fstat
sys_lstat lxstat lstat 2 __syscall_lstat