2004-09-20 00:16:11 +00:00
|
|
|
/* Copyright (C) 1998, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
|
1998-10-16 16:33:36 +00:00
|
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
2001-07-06 04:58:11 +00:00
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
1998-10-16 16:33:36 +00:00
|
|
|
|
|
|
|
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
|
2001-07-06 04:58:11 +00:00
|
|
|
Lesser General Public License for more details.
|
1998-10-16 16:33:36 +00:00
|
|
|
|
2001-07-06 04:58:11 +00:00
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with the GNU C Library; if not, write to the Free
|
|
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
|
|
02111-1307 USA. */
|
1998-10-16 16:33:36 +00:00
|
|
|
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
|
|
#include <linux/posix_types.h>
|
|
|
|
|
1998-10-21 15:29:52 +00:00
|
|
|
#include <sysdep.h>
|
1998-10-16 16:33:36 +00:00
|
|
|
#include <sys/syscall.h>
|
2000-01-17 05:24:52 +00:00
|
|
|
#include "kernel-features.h"
|
2004-09-20 00:16:11 +00:00
|
|
|
#include <pthread-functions.h>
|
|
|
|
|
2000-01-17 05:24:52 +00:00
|
|
|
|
2004-10-14 16:18:09 +00:00
|
|
|
#if defined __NR_setresuid || defined __NR_setresuid32
|
1998-10-16 16:33:36 +00:00
|
|
|
|
2000-01-17 05:24:52 +00:00
|
|
|
# ifdef __NR_setresuid32
|
|
|
|
# if __ASSUME_32BITUIDS == 0
|
|
|
|
/* This variable is shared with all files that need to check for 32bit
|
|
|
|
uids. */
|
|
|
|
extern int __libc_missing_32bit_uids;
|
|
|
|
# endif
|
|
|
|
# endif /* __NR_setresuid32 */
|
|
|
|
|
1998-10-16 16:33:36 +00:00
|
|
|
int
|
1998-10-20 22:27:42 +00:00
|
|
|
__setresuid (uid_t ruid, uid_t euid, uid_t suid)
|
1998-10-16 16:33:36 +00:00
|
|
|
{
|
2004-09-20 00:16:11 +00:00
|
|
|
int result;
|
|
|
|
|
2004-10-14 16:18:09 +00:00
|
|
|
# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresuid
|
2004-09-20 00:16:11 +00:00
|
|
|
result = INLINE_SYSCALL (setresuid32, 3, ruid, euid, suid);
|
2000-01-17 05:24:52 +00:00
|
|
|
# else
|
|
|
|
# ifdef __NR_setresuid32
|
2000-02-11 19:44:58 +00:00
|
|
|
if (__libc_missing_32bit_uids <= 0)
|
2000-01-17 05:24:52 +00:00
|
|
|
{
|
|
|
|
int saved_errno = errno;
|
|
|
|
|
|
|
|
result = INLINE_SYSCALL (setresuid32, 3, ruid, euid, suid);
|
2004-09-20 00:16:11 +00:00
|
|
|
if (result == 0)
|
|
|
|
goto out;
|
|
|
|
if (errno != ENOSYS)
|
2000-01-17 05:24:52 +00:00
|
|
|
return result;
|
|
|
|
|
|
|
|
__set_errno (saved_errno);
|
|
|
|
__libc_missing_32bit_uids = 1;
|
|
|
|
}
|
|
|
|
# endif /* __NR_setresuid32 */
|
|
|
|
|
2000-01-18 04:33:34 +00:00
|
|
|
if (((ruid + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
|
|
|| ((euid + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
|
|
|| ((suid + 1) > (uid_t) ((__kernel_uid_t) -1U)))
|
1998-10-16 16:33:36 +00:00
|
|
|
{
|
|
|
|
__set_errno (EINVAL);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2004-09-20 00:16:11 +00:00
|
|
|
result = INLINE_SYSCALL (setresuid, 3, ruid, euid, suid);
|
|
|
|
# ifdef __NR_setresuid32
|
|
|
|
out:
|
|
|
|
# endif
|
2000-01-17 05:24:52 +00:00
|
|
|
# endif
|
2004-09-20 00:16:11 +00:00
|
|
|
|
|
|
|
#if defined HAVE_PTR__NPTL_SETXID && !defined SINGLE_THREAD
|
|
|
|
if (result == 0 && __libc_pthread_functions.ptr__nptl_setxid != NULL)
|
|
|
|
{
|
|
|
|
struct xid_command cmd;
|
|
|
|
cmd.syscall_no = __NR_setresuid32;
|
|
|
|
cmd.id[0] = ruid;
|
|
|
|
cmd.id[1] = euid;
|
|
|
|
cmd.id[2] = suid;
|
|
|
|
__libc_pthread_functions.ptr__nptl_setxid (&cmd);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return result;
|
1998-10-16 16:33:36 +00:00
|
|
|
}
|
* elf/rtld-Rules ($(objpfx)rtld-libc.a): Use $(verbose) in ar command.
* sysdeps/mach/hurd/getresuid.c: New file.
* sysdeps/mach/hurd/getresgid.c: New file.
* sysdeps/mach/hurd/setresuid.c: New file.
* sysdeps/mach/hurd/setresgid.c: New file.
* posix/unistd.h [__USE_GNU] (getresuid, getresgid, setresuid,
setresgid): Declare them.
* NEWS: Mention it.
* include/unistd.h
(__getresuid, __getresgid, __setresuid, __setresgid): Declare them,
add libc_hidden_proto.
* posix/Versions (libc: GLIBC_2.3.2): New set. Add
getresuid, getresgid, setresuid, setresgid here.
* Versions.def (libc): Define GLIBC_2.3.2 set.
* sysdeps/generic/getresuid.c (__getresuid): Fix argument types.
Add libc_hidden_def.
* sysdeps/generic/getresgid.c (__getresgid): Likewise.
* sysdeps/generic/setresgid.c: New file.
* sysdeps/generic/setresuid.c: New file.
* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
(sysdep_routines): Don't add getresuid and getresgid here.
* sysdeps/unix/sysv/linux/arm/Makefile [$(subdir) = misc]
(sysdep_routines): Don't add setresuid and setresgid here.
* sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
* sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
* sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
* posix/Makefile (routines): Add them all here instead.
* sysdeps/unix/sysv/linux/i386/getresuid.c (getresuid): Renamed to
__getresuid. Add libc_hidden_def for that, and weak alias to old name.
* sysdeps/unix/sysv/linux/i386/getresgid.c (getresgid): Renamed to
__getresgid. Add libc_hidden_def for that, and weak alias to old name.
* sysdeps/unix/sysv/linux/i386/setresuid.c: Add libc_hidden_def.
[! __NR_setresuid]: Include generic file.
* sysdeps/unix/sysv/linux/i386/setresgid.c (setresgid): Renamed to
__setresgid. Add libc_hidden_def for that, and weak alias to old name.
[! __NR_setresuid]: Include generic file.
* sysdeps/unix/sysv/linux/syscalls.list (setresuid, setresgid):
Caller is - now, not EXTRA.
* sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
(setresuid, setresgid, getresuid, getresgid): Likewise.
* sysdeps/unix/sysv/linux/syscalls.list (getresuid, getresgid):
Add these calls here.
* sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove them here.
* sysdeps/unix/sysv/linux/hppa/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
(sysdep_routines): Add setfsuid and setfsgid here.
* sysdeps/unix/sysv/linux/arm/Makefile: Not here.
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
* sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
* sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
* hurd/errno.c: Renamed to ...
* hurd/errno-loc.c: ... this.
* hurd/Makefile (routines): errno -> errno-loc
2002-10-14 01:03:16 +00:00
|
|
|
libc_hidden_def (__setresuid)
|
2004-09-20 00:16:11 +00:00
|
|
|
#ifndef __setresuid
|
1998-10-16 16:33:36 +00:00
|
|
|
weak_alias (__setresuid, setresuid)
|
2004-09-20 00:16:11 +00:00
|
|
|
#endif
|
* elf/rtld-Rules ($(objpfx)rtld-libc.a): Use $(verbose) in ar command.
* sysdeps/mach/hurd/getresuid.c: New file.
* sysdeps/mach/hurd/getresgid.c: New file.
* sysdeps/mach/hurd/setresuid.c: New file.
* sysdeps/mach/hurd/setresgid.c: New file.
* posix/unistd.h [__USE_GNU] (getresuid, getresgid, setresuid,
setresgid): Declare them.
* NEWS: Mention it.
* include/unistd.h
(__getresuid, __getresgid, __setresuid, __setresgid): Declare them,
add libc_hidden_proto.
* posix/Versions (libc: GLIBC_2.3.2): New set. Add
getresuid, getresgid, setresuid, setresgid here.
* Versions.def (libc): Define GLIBC_2.3.2 set.
* sysdeps/generic/getresuid.c (__getresuid): Fix argument types.
Add libc_hidden_def.
* sysdeps/generic/getresgid.c (__getresgid): Likewise.
* sysdeps/generic/setresgid.c: New file.
* sysdeps/generic/setresuid.c: New file.
* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
(sysdep_routines): Don't add getresuid and getresgid here.
* sysdeps/unix/sysv/linux/arm/Makefile [$(subdir) = misc]
(sysdep_routines): Don't add setresuid and setresgid here.
* sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
* sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
* sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
* posix/Makefile (routines): Add them all here instead.
* sysdeps/unix/sysv/linux/i386/getresuid.c (getresuid): Renamed to
__getresuid. Add libc_hidden_def for that, and weak alias to old name.
* sysdeps/unix/sysv/linux/i386/getresgid.c (getresgid): Renamed to
__getresgid. Add libc_hidden_def for that, and weak alias to old name.
* sysdeps/unix/sysv/linux/i386/setresuid.c: Add libc_hidden_def.
[! __NR_setresuid]: Include generic file.
* sysdeps/unix/sysv/linux/i386/setresgid.c (setresgid): Renamed to
__setresgid. Add libc_hidden_def for that, and weak alias to old name.
[! __NR_setresuid]: Include generic file.
* sysdeps/unix/sysv/linux/syscalls.list (setresuid, setresgid):
Caller is - now, not EXTRA.
* sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
(setresuid, setresgid, getresuid, getresgid): Likewise.
* sysdeps/unix/sysv/linux/syscalls.list (getresuid, getresgid):
Add these calls here.
* sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove them here.
* sysdeps/unix/sysv/linux/hppa/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/x86_64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/ia64/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/Makefile [$(subdir) = misc]
(sysdep_routines): Add setfsuid and setfsgid here.
* sysdeps/unix/sysv/linux/arm/Makefile: Not here.
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/cris/Makefile: Likewise.
* sysdeps/unix/sysv/linux/sh/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/Makefile: Likewise.
* sysdeps/unix/sysv/linux/i386/Makefile: Likewise.
* sysdeps/unix/sysv/linux/m68k/Makefile: Likewise.
* hurd/errno.c: Renamed to ...
* hurd/errno-loc.c: ... this.
* hurd/Makefile (routines): errno -> errno-loc
2002-10-14 01:03:16 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#include <sysdeps/generic/setresuid.c>
|
|
|
|
|
1998-10-16 16:33:36 +00:00
|
|
|
#endif
|