This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Fix for seteuid.


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




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]