mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
Remove pre-2.4 Linux kernel support.
This commit is contained in:
parent
a386f1cc22
commit
21708942c9
160
ChangeLog
160
ChangeLog
@ -1,3 +1,163 @@
|
|||||||
|
2012-05-25 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
[BZ #13717]
|
||||||
|
* sysdeps/unix/sysv/linux/configure.in (arch_minimum_kernel): Set
|
||||||
|
to 2.4.0 where earlier.
|
||||||
|
* sysdeps/unix/sysv/linux/configure: Regenerated.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/chown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/fchown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/fchownat.c (fchownat)
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
(fchownat) [!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getegid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/geteuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getgid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getgroups.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getresgid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getresuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/getuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/lchown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/msgctl.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/semctl.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setegid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__NR_setresgid] (__setresgid): Do not declare.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/seteuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__NR_setresuid] (__setresuid): Do not declare.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setfsgid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setfsuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setgid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setgroups.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setregid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setresgid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setresuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setreuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/setuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/shmctl.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/kernel-features.h
|
||||||
|
(__ASSUME_SETRESUID_SYSCALL): Remove.
|
||||||
|
(__ASSUME_SETRESGID_SYSCALL): Likewise.
|
||||||
|
(__ASSUME_32BITUIDS): Likewise.
|
||||||
|
(__ASSUME_LDT_WORKS): Likewise.
|
||||||
|
(__ASSUME_O_DIRECTORY): Likewise.
|
||||||
|
(__ASSUME_NEW_GETRLIMIT_SYSCALL): Define conditional on
|
||||||
|
architecture but not kernel version.
|
||||||
|
(__ASSUME_TRUNCATE64_SYSCALL): Likewise.
|
||||||
|
(__ASSUME_MMAP2_SYSCALL): Likewise.
|
||||||
|
(__ASSUME_STAT64_SYSCALL): Likewise.
|
||||||
|
(__ASSUME_IPC64): Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/local-setxid.h: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/opendir.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_O_DIRECTORY]: Make code unconditional.
|
||||||
|
* sysdeps/unix/sysv/linux/opensock.c [__LINUX_KERNEL_VERSION <
|
||||||
|
132096]: Remove conditional code.
|
||||||
|
[__LINUX_KERNEL_VERSION >= 132096]: Make code unconditional.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/chown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/s390/s390-32/lchown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/setegid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__NR_setresgid || __ASSUME_SETRESGID_SYSCALL]: Make code
|
||||||
|
unconditional.
|
||||||
|
(__setresgid): Do not declare.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/seteuid.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__NR_setresuid || __ASSUME_SETRESUID_SYSCALL]: Make code
|
||||||
|
unconditional.
|
||||||
|
(__setresuid): Do not declare.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/sh/chown.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c: Do not include
|
||||||
|
<kernel-features.h>.
|
||||||
|
[__ASSUME_32BITUIDS]: Make code unconditional.
|
||||||
|
[!__ASSUME_32BITUIDS]: Remove conditional code.
|
||||||
|
|
||||||
2012-05-25 Richard Henderson <rth@twiddle.net>
|
2012-05-25 Richard Henderson <rth@twiddle.net>
|
||||||
|
|
||||||
* sysdeps/powerpc/powerpc32/dl-irel.h (elf_ifunc_invoke): Pass
|
* sysdeps/powerpc/powerpc32/dl-irel.h (elf_ifunc_invoke): Pass
|
||||||
|
2
NEWS
2
NEWS
@ -67,7 +67,7 @@ Version 2.16
|
|||||||
after the TI-RPC library becomes fully sufficient for the needs of
|
after the TI-RPC library becomes fully sufficient for the needs of
|
||||||
existing applications.
|
existing applications.
|
||||||
|
|
||||||
* Compatibility code for Linux kernel versions before 2.2 has been removed.
|
* Compatibility code for Linux kernel versions before 2.4 has been removed.
|
||||||
Note that glibc is not expected to work with any Linux kernel version
|
Note that glibc is not expected to work with any Linux kernel version
|
||||||
before 2.6.
|
before 2.6.
|
||||||
|
|
||||||
|
13
sysdeps/unix/sysv/linux/configure
vendored
13
sysdeps/unix/sysv/linux/configure
vendored
@ -284,25 +284,25 @@ test -n "$arch_minimum_kernel" ||
|
|||||||
case "$machine" in
|
case "$machine" in
|
||||||
i386*)
|
i386*)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
powerpc/powerpc32)
|
powerpc/powerpc32)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
powerpc/powerpc64)
|
powerpc/powerpc64)
|
||||||
arch_minimum_kernel=2.4.21
|
arch_minimum_kernel=2.4.21
|
||||||
;;
|
;;
|
||||||
s390/s390-32)
|
s390/s390-32)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.10
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
s390/s390-64)
|
s390/s390-64)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.4.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
sh*)
|
sh*)
|
||||||
arch_minimum_kernel=2.3.99
|
arch_minimum_kernel=2.4.0
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
;;
|
;;
|
||||||
sparc/sparc64*)
|
sparc/sparc64*)
|
||||||
@ -311,13 +311,10 @@ case "$machine" in
|
|||||||
;;
|
;;
|
||||||
sparc*)
|
sparc*)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
|
||||||
;;
|
|
||||||
x86_64*)
|
|
||||||
arch_minimum_kernel=2.4.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if test -n "$minimum_kernel"; then
|
if test -n "$minimum_kernel"; then
|
||||||
|
@ -41,25 +41,25 @@ test -n "$arch_minimum_kernel" ||
|
|||||||
case "$machine" in
|
case "$machine" in
|
||||||
i386*)
|
i386*)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
powerpc/powerpc32)
|
powerpc/powerpc32)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
powerpc/powerpc64)
|
powerpc/powerpc64)
|
||||||
arch_minimum_kernel=2.4.21
|
arch_minimum_kernel=2.4.21
|
||||||
;;
|
;;
|
||||||
s390/s390-32)
|
s390/s390-32)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.10
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
s390/s390-64)
|
s390/s390-64)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.4.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
sh*)
|
sh*)
|
||||||
arch_minimum_kernel=2.3.99
|
arch_minimum_kernel=2.4.0
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
;;
|
;;
|
||||||
sparc/sparc64*)
|
sparc/sparc64*)
|
||||||
@ -68,13 +68,10 @@ case "$machine" in
|
|||||||
;;
|
;;
|
||||||
sparc*)
|
sparc*)
|
||||||
libc_cv_gcc_unwind_find_fde=yes
|
libc_cv_gcc_unwind_find_fde=yes
|
||||||
arch_minimum_kernel=2.2.0
|
|
||||||
;;
|
|
||||||
x86_64*)
|
|
||||||
arch_minimum_kernel=2.4.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
arch_minimum_kernel=2.2.0
|
arch_minimum_kernel=2.4.0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if test -n "$minimum_kernel"; then
|
if test -n "$minimum_kernel"; then
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
In Linux 2.1.x the chown functions have been changed. A new function lchown
|
In Linux 2.1.x the chown functions have been changed. A new function lchown
|
||||||
@ -41,44 +40,12 @@ extern int __chown_is_lchown (const char *__file, uid_t __owner,
|
|||||||
extern int __real_chown (const char *__file, uid_t __owner, gid_t __group);
|
extern int __real_chown (const char *__file, uid_t __owner, gid_t __group);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_chown32
|
/* Consider moving to syscalls.list. */
|
||||||
# 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_chown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__real_chown (const char *file, uid_t owner, gid_t group)
|
__real_chown (const char *file, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS
|
|
||||||
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
||||||
#else
|
|
||||||
/* !__ASSUME_32BITUIDS */
|
|
||||||
# ifdef __NR_chown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_chown32 */
|
|
||||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -22,46 +22,13 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_fchown32
|
/* Consider moving to syscalls.list. */
|
||||||
# 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_fchown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__fchown (int fd, uid_t owner, gid_t group)
|
__fchown (int fd, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (fchown32, 3, fd, owner, group);
|
return INLINE_SYSCALL (fchown32, 3, fd, owner, group);
|
||||||
#else
|
|
||||||
# ifdef __NR_fchown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (fchown32, 3, fd, owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_fchown32 */
|
|
||||||
|
|
||||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SYSCALL (fchown, 3, fd, owner, group);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__fchown, fchown)
|
weak_alias (__fchown, fchown)
|
||||||
|
@ -83,7 +83,6 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
|||||||
file = buf;
|
file = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
|
|
||||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||||
@ -98,15 +97,6 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
|||||||
__atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
|
__atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
# else
|
|
||||||
/* Don't inline the rest to avoid unnecessary code duplication. */
|
|
||||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
|
||||||
result = __lchown (file, owner, group);
|
|
||||||
else
|
|
||||||
result = __chown (file, owner, group);
|
|
||||||
if (result < 0)
|
|
||||||
__atfct_seterrno (errno, fd, buf);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,41 +20,14 @@
|
|||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_getegid32
|
/* Consider moving to syscalls.list. */
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
#endif /* __NR_getegid32 */
|
|
||||||
|
|
||||||
gid_t
|
gid_t
|
||||||
__getegid (void)
|
__getegid (void)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getegid32, err, 0);
|
return INTERNAL_SYSCALL (getegid32, err, 0);
|
||||||
#else
|
|
||||||
# ifdef __NR_getegid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (getegid32, err, 0);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getegid32 */
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getegid, err, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__getegid, getegid)
|
weak_alias (__getegid, getegid)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,41 +20,14 @@
|
|||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_geteuid32
|
/* Consider moving to syscalls.list. */
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
#endif /* __NR_geteuid32 */
|
|
||||||
|
|
||||||
uid_t
|
uid_t
|
||||||
__geteuid (void)
|
__geteuid (void)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (geteuid32, err, 0);
|
return INTERNAL_SYSCALL (geteuid32, err, 0);
|
||||||
#else
|
|
||||||
# ifdef __NR_geteuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (geteuid32, err, 0);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_geteuid32 */
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (geteuid, err, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__geteuid, geteuid)
|
weak_alias (__geteuid, geteuid)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -21,41 +21,13 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
/* Consider moving to syscalls.list. */
|
||||||
|
|
||||||
#ifdef __NR_getgid32
|
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
#endif /* __NR_getgid32 */
|
|
||||||
|
|
||||||
gid_t
|
gid_t
|
||||||
__getgid (void)
|
__getgid (void)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getgid32, err, 0);
|
return INTERNAL_SYSCALL (getgid32, err, 0);
|
||||||
#else
|
|
||||||
# ifdef __NR_getgid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (getgid32, err, 0);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getgid32 */
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getgid, err, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__getgid, getgid)
|
weak_alias (__getgid, getgid)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1997, 1998, 2000, 2001, 2003 Free Software Foundation, Inc.
|
/* Copyright (C) 1997-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,57 +25,16 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_getgroups32
|
/* Consider moving to syscalls.list. */
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
#endif /* __NR_getgroups32 */
|
|
||||||
|
|
||||||
/* For Linux we must convert the array of groups from the format that the
|
/* For Linux we must convert the array of groups from the format that the
|
||||||
kernel returns. */
|
kernel returns. */
|
||||||
int
|
int
|
||||||
__getgroups (int n, gid_t *groups)
|
__getgroups (int n, gid_t *groups)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n));
|
return INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n));
|
||||||
#else
|
|
||||||
if (__builtin_expect (n, 1) < 0)
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
# ifdef __NR_getgroups32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (getgroups32, 2, n, CHECK_N (groups, n));
|
|
||||||
if (result != -1 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getgroups32 */
|
|
||||||
|
|
||||||
int i, ngids;
|
|
||||||
__kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))];
|
|
||||||
|
|
||||||
ngids = INLINE_SYSCALL (getgroups, 2, n, CHECK_N (kernel_groups, n));
|
|
||||||
if (n != 0 && ngids > 0)
|
|
||||||
for (i = 0; i < ngids; i++)
|
|
||||||
(__ptrvalue (groups))[i] = kernel_groups[i];
|
|
||||||
return ngids;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__getgroups, getgroups)
|
weak_alias (__getgroups, getgroups)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2005,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,60 +25,13 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
/* Consider moving to syscalls.list. */
|
||||||
|
|
||||||
#ifdef __NR_getresgid
|
|
||||||
|
|
||||||
# ifdef __NR_getresgid32
|
|
||||||
# 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_getresgid32 */
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
|
__getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid)
|
||||||
{
|
{
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (getresgid32, 3, CHECK_1 (rgid),
|
return INLINE_SYSCALL (getresgid32, 3, CHECK_1 (rgid),
|
||||||
CHECK_1 (egid), CHECK_1 (sgid));
|
CHECK_1 (egid), CHECK_1 (sgid));
|
||||||
# else
|
|
||||||
__kernel_gid_t k_rgid, k_egid, k_sgid;
|
|
||||||
int result;
|
|
||||||
# ifdef __NR_getresgid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
r = INLINE_SYSCALL (getresgid32, 3, CHECK_1 (rgid),
|
|
||||||
CHECK_1 (egid), CHECK_1 (sgid));
|
|
||||||
if (r == 0 || errno != ENOSYS)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getresgid32 */
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (getresgid, 3, __ptrvalue (&k_rgid),
|
|
||||||
__ptrvalue (&k_egid), __ptrvalue (&k_sgid));
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
{
|
|
||||||
*rgid = (gid_t) k_rgid;
|
|
||||||
*egid = (gid_t) k_egid;
|
|
||||||
*sgid = (gid_t) k_sgid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
libc_hidden_def (__getresgid)
|
libc_hidden_def (__getresgid)
|
||||||
weak_alias (__getresgid, getresgid)
|
weak_alias (__getresgid, getresgid)
|
||||||
|
|
||||||
#else
|
|
||||||
# include <posix/getresgid.c>
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2005,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -25,59 +25,13 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
/* Consider moving to syscalls.list. */
|
||||||
|
|
||||||
#ifdef __NR_getresuid
|
|
||||||
|
|
||||||
# ifdef __NR_getresuid32
|
|
||||||
# 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_getresuid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
|
__getresuid (uid_t *ruid, uid_t *euid, uid_t *suid)
|
||||||
{
|
{
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (getresuid32, 3, CHECK_1 (ruid),
|
return INLINE_SYSCALL (getresuid32, 3, CHECK_1 (ruid),
|
||||||
CHECK_1 (euid), CHECK_1 (suid));
|
CHECK_1 (euid), CHECK_1 (suid));
|
||||||
# else
|
|
||||||
__kernel_uid_t k_ruid, k_euid, k_suid;
|
|
||||||
int result;
|
|
||||||
# ifdef __NR_getresuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
r = INLINE_SYSCALL (getresuid32, 3, CHECK_1 (ruid),
|
|
||||||
CHECK_1 (euid), CHECK_1 (suid));
|
|
||||||
if (r == 0 || errno != ENOSYS)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getresuid32 */
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (getresuid, 3, __ptrvalue (&k_ruid),
|
|
||||||
__ptrvalue (&k_euid), __ptrvalue (&k_suid));
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
{
|
|
||||||
*ruid = (uid_t) k_ruid;
|
|
||||||
*euid = (uid_t) k_euid;
|
|
||||||
*suid = (uid_t) k_suid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
libc_hidden_def (__getresuid)
|
libc_hidden_def (__getresuid)
|
||||||
weak_alias (__getresuid, getresuid)
|
weak_alias (__getresuid, getresuid)
|
||||||
|
|
||||||
#else
|
|
||||||
# include <posix/getresuid.c>
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -21,44 +21,13 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
/* Consider moving to syscalls.list. */
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. This is the definition.
|
|
||||||
-1 if libc does not know yet whether kernel has 32bit uids or not.
|
|
||||||
0 if it does have them.
|
|
||||||
1 if it does not have them. */
|
|
||||||
int __libc_missing_32bit_uids attribute_hidden = -1;
|
|
||||||
# endif
|
|
||||||
#endif /* __NR_getuid32 */
|
|
||||||
|
|
||||||
uid_t
|
uid_t
|
||||||
__getuid (void)
|
__getuid (void)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getuid32, err, 0);
|
return INTERNAL_SYSCALL (getuid32, err, 0);
|
||||||
#else
|
|
||||||
# ifdef __NR_getuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (getuid32, err, 0);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_getuid32 */
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (getuid, err, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__getuid, getuid)
|
weak_alias (__getuid, getuid)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000,2003,2005,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,51 +23,13 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_lchown
|
/* Consider moving to syscalls.list. */
|
||||||
# ifdef __NR_lchown32
|
|
||||||
# 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_lchown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__lchown (const char *file, uid_t owner, gid_t group)
|
__lchown (const char *file, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
return INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
||||||
# else
|
|
||||||
# ifdef __NR_lchown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_lchown32 */
|
|
||||||
|
|
||||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SYSCALL (lchown, 3, CHECK_STRING (file), owner, group);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__lchown, lchown)
|
weak_alias (__lchown, lchown)
|
||||||
|
|
||||||
#else
|
|
||||||
# include <io/lchown.c>
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995,1997,1998,2000,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
||||||
|
|
||||||
@ -25,7 +25,6 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
struct __old_msqid_ds
|
struct __old_msqid_ds
|
||||||
@ -52,14 +51,6 @@ int __old_msgctl (int, int, struct __old_msqid_ds *);
|
|||||||
#endif
|
#endif
|
||||||
int __new_msgctl (int, int, struct msqid_ds *);
|
int __new_msgctl (int, int, struct msqid_ds *);
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
# 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
|
|
||||||
|
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
||||||
int
|
int
|
||||||
attribute_compat_text_section
|
attribute_compat_text_section
|
||||||
@ -74,85 +65,8 @@ compat_symbol (libc, __old_msgctl, msgctl, GLIBC_2_0);
|
|||||||
int
|
int
|
||||||
__new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
|
__new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
|
return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
|
||||||
msqid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
msqid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
||||||
#else
|
|
||||||
switch (cmd) {
|
|
||||||
case MSG_STAT:
|
|
||||||
case IPC_STAT:
|
|
||||||
case IPC_SET:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
|
|
||||||
msqid, cmd, 0, CHECK_1 (buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
struct __old_msqid_ds old;
|
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
if (__libc_missing_32bit_uids < 0)
|
|
||||||
{
|
|
||||||
int save_errno = errno;
|
|
||||||
|
|
||||||
/* Test presence of new IPC by testing for getuid32 syscall. */
|
|
||||||
result = INLINE_SYSCALL (getuid32, 0);
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
else
|
|
||||||
__libc_missing_32bit_uids = 0;
|
|
||||||
__set_errno(save_errno);
|
|
||||||
}
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
|
|
||||||
msqid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (cmd == IPC_SET)
|
|
||||||
{
|
|
||||||
old.msg_perm.uid = buf->msg_perm.uid;
|
|
||||||
old.msg_perm.gid = buf->msg_perm.gid;
|
|
||||||
old.msg_perm.mode = buf->msg_perm.mode;
|
|
||||||
old.msg_qbytes = buf->msg_qbytes;
|
|
||||||
if (old.msg_perm.uid != buf->msg_perm.uid ||
|
|
||||||
old.msg_perm.gid != buf->msg_perm.gid ||
|
|
||||||
old.msg_qbytes != buf->msg_qbytes)
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_msgctl,
|
|
||||||
msqid, cmd, 0, __ptrvalue (&old));
|
|
||||||
if (result != -1 && cmd != IPC_SET)
|
|
||||||
{
|
|
||||||
memset(buf, 0, sizeof(*buf));
|
|
||||||
buf->msg_perm.__key = old.msg_perm.__key;
|
|
||||||
buf->msg_perm.uid = old.msg_perm.uid;
|
|
||||||
buf->msg_perm.gid = old.msg_perm.gid;
|
|
||||||
buf->msg_perm.cuid = old.msg_perm.cuid;
|
|
||||||
buf->msg_perm.cgid = old.msg_perm.cgid;
|
|
||||||
buf->msg_perm.mode = old.msg_perm.mode;
|
|
||||||
buf->msg_perm.__seq = old.msg_perm.__seq;
|
|
||||||
buf->msg_stime = old.msg_stime;
|
|
||||||
buf->msg_rtime = old.msg_rtime;
|
|
||||||
buf->msg_ctime = old.msg_ctime;
|
|
||||||
buf->__msg_cbytes = old.__msg_cbytes;
|
|
||||||
buf->msg_qnum = old.msg_qnum;
|
|
||||||
buf->msg_qbytes = old.msg_qbytes;
|
|
||||||
buf->msg_lspid = old.msg_lspid;
|
|
||||||
buf->msg_lrpid = old.msg_lrpid;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
versioned_symbol (libc, __new_msgctl, msgctl, GLIBC_2_2);
|
versioned_symbol (libc, __new_msgctl, msgctl, GLIBC_2_2);
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
/* Copyright (C) 1995,1997,1998,2000,2003,2004,2006
|
/* Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
||||||
|
|
||||||
@ -26,7 +25,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
struct __old_semid_ds
|
struct __old_semid_ds
|
||||||
@ -54,14 +52,6 @@ union semun
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
#include <bp-semctl.h> /* definition of CHECK_SEMCTL needs union semum */
|
#include <bp-semctl.h> /* definition of CHECK_SEMCTL needs union semum */
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
# 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
|
|
||||||
|
|
||||||
/* Return identifier for array of NSEMS semaphores associated with
|
/* Return identifier for array of NSEMS semaphores associated with
|
||||||
KEY. */
|
KEY. */
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
||||||
@ -103,82 +93,8 @@ __new_semctl (int semid, int semnum, int cmd, ...)
|
|||||||
|
|
||||||
va_end (ap);
|
va_end (ap);
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
||||||
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
||||||
#else
|
|
||||||
switch (cmd) {
|
|
||||||
case SEM_STAT:
|
|
||||||
case IPC_STAT:
|
|
||||||
case IPC_SET:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
struct __old_semid_ds old;
|
|
||||||
struct semid_ds *buf;
|
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
if (__libc_missing_32bit_uids < 0)
|
|
||||||
{
|
|
||||||
int save_errno = errno;
|
|
||||||
|
|
||||||
/* Test presence of new IPC by testing for getuid32 syscall. */
|
|
||||||
result = INLINE_SYSCALL (getuid32, 0);
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
else
|
|
||||||
__libc_missing_32bit_uids = 0;
|
|
||||||
__set_errno(save_errno);
|
|
||||||
}
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buf = arg.buf;
|
|
||||||
arg.__old_buf = &old;
|
|
||||||
if (cmd == IPC_SET)
|
|
||||||
{
|
|
||||||
old.sem_perm.uid = buf->sem_perm.uid;
|
|
||||||
old.sem_perm.gid = buf->sem_perm.gid;
|
|
||||||
old.sem_perm.mode = buf->sem_perm.mode;
|
|
||||||
if (old.sem_perm.uid != buf->sem_perm.uid ||
|
|
||||||
old.sem_perm.gid != buf->sem_perm.gid)
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd));
|
|
||||||
if (result != -1 && cmd != IPC_SET)
|
|
||||||
{
|
|
||||||
memset(buf, 0, sizeof(*buf));
|
|
||||||
buf->sem_perm.__key = old.sem_perm.__key;
|
|
||||||
buf->sem_perm.uid = old.sem_perm.uid;
|
|
||||||
buf->sem_perm.gid = old.sem_perm.gid;
|
|
||||||
buf->sem_perm.cuid = old.sem_perm.cuid;
|
|
||||||
buf->sem_perm.cgid = old.sem_perm.cgid;
|
|
||||||
buf->sem_perm.mode = old.sem_perm.mode;
|
|
||||||
buf->sem_perm.__seq = old.sem_perm.__seq;
|
|
||||||
buf->sem_otime = old.sem_otime;
|
|
||||||
buf->sem_ctime = old.sem_ctime;
|
|
||||||
buf->sem_nsems = old.sem_nsems;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
|
versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
/* Copyright (C) 1995-1998,2000,2002,2003,2004,2006
|
/* Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,13 +18,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setresgid
|
|
||||||
extern int __setresgid (uid_t rgid, uid_t egid, uid_t sgid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
setegid (gid)
|
setegid (gid)
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
@ -38,23 +32,7 @@ setegid (gid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
|
result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
|
||||||
#else
|
|
||||||
/* First try the syscall. */
|
|
||||||
# ifdef __NR_setresgid
|
|
||||||
result = __setresgid (-1, gid, -1);
|
|
||||||
# if __ASSUME_SETRESGID_SYSCALL > 0
|
|
||||||
if (0)
|
|
||||||
# else
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
# endif
|
|
||||||
/* No system call available. Use emulation. This may not work
|
|
||||||
since `setregid' also sets the saved user ID when GID is not
|
|
||||||
equal to the real user ID, making it impossible to switch back. */
|
|
||||||
# endif
|
|
||||||
result = __setregid (-1, gid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -18,13 +18,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setresuid
|
|
||||||
extern int __setresuid (uid_t ruid, uid_t euid, uid_t suid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
seteuid (uid_t uid)
|
seteuid (uid_t uid)
|
||||||
{
|
{
|
||||||
@ -36,23 +31,7 @@ seteuid (uid_t uid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);
|
result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);
|
||||||
#else
|
|
||||||
/* First try the syscall. */
|
|
||||||
# ifdef __NR_setresuid
|
|
||||||
result = __setresuid (-1, uid, -1);
|
|
||||||
# if __ASSUME_SETRESUID_SYSCALL > 0
|
|
||||||
if (0)
|
|
||||||
# else
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
# endif
|
|
||||||
/* 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. */
|
|
||||||
# endif
|
|
||||||
result = __setreuid (-1, uid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998, 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -22,48 +22,12 @@
|
|||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
/* Consider moving to syscalls.list. */
|
||||||
#ifdef __NR_setfsgid
|
|
||||||
|
|
||||||
# ifdef __NR_setfsgid32
|
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
# endif /* __NR_setfsgid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
setfsgid (gid_t gid)
|
setfsgid (gid_t gid)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (setfsgid32, err, 1, gid);
|
return INTERNAL_SYSCALL (setfsgid32, err, 1, gid);
|
||||||
# else
|
|
||||||
# ifdef __NR_setfsgid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (setfsgid32, err, 1, gid);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
}
|
||||||
# endif /* __NR_setfsgid32 */
|
|
||||||
if (gid != (gid_t) ((__kernel_gid_t) gid))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (setfsgid, err, 1, gid);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998, 2000, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,48 +23,12 @@
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_setfsuid
|
/* Consider moving to syscalls.list. */
|
||||||
|
|
||||||
# ifdef __NR_setfsuid32
|
|
||||||
# if __ASSUME_32BITUIDS == 0
|
|
||||||
/* This variable is shared with all files that need to check for 32bit
|
|
||||||
uids. */
|
|
||||||
extern int __libc_missing_32bit_uids attribute_hidden;
|
|
||||||
# endif
|
|
||||||
# endif /* __NR_setfsuid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
setfsuid (uid_t uid)
|
setfsuid (uid_t uid)
|
||||||
{
|
{
|
||||||
INTERNAL_SYSCALL_DECL (err);
|
INTERNAL_SYSCALL_DECL (err);
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (setfsuid32, err, 1, uid);
|
return INTERNAL_SYSCALL (setfsuid32, err, 1, uid);
|
||||||
# else
|
|
||||||
# ifdef __NR_setfsuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
|
|
||||||
result = INTERNAL_SYSCALL (setfsuid32, err, 1, uid);
|
|
||||||
if (! INTERNAL_SYSCALL_ERROR_P (result, err)
|
|
||||||
|| INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
}
|
||||||
# endif /* __NR_setfsuid32 */
|
|
||||||
|
|
||||||
if (uid != (uid_t) ((__kernel_uid_t) uid))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* No error checking. */
|
|
||||||
return INTERNAL_SYSCALL (setfsuid, err, 1, uid);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998, 2000, 2003, 2004, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,54 +19,13 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setgid32
|
|
||||||
# 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_setgid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setgid (gid_t gid)
|
__setgid (gid_t gid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
result = INLINE_SETXID_SYSCALL (setgid32, 1, gid);
|
result = INLINE_SETXID_SYSCALL (setgid32, 1, gid);
|
||||||
#else
|
|
||||||
# ifdef __NR_setgid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setgid32, 1, gid);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setgid32 */
|
|
||||||
|
|
||||||
if (gid == (gid_t) ~0
|
|
||||||
|| gid != (gid_t) ((__kernel_gid_t) gid))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setgid, 1, gid);
|
|
||||||
# ifdef __NR_setgid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
/* Copyright (C) 1997,1998,2000,2002,2004,2006,2011
|
/* Copyright (C) 1997-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -27,16 +26,6 @@
|
|||||||
|
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setgroups32
|
|
||||||
# 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_setgroups32 */
|
|
||||||
|
|
||||||
/* Set the group set for the current user to GROUPS (N of them). For
|
/* Set the group set for the current user to GROUPS (N of them). For
|
||||||
Linux we must convert the array of groups into the format that the
|
Linux we must convert the array of groups into the format that the
|
||||||
@ -44,47 +33,6 @@ extern int __libc_missing_32bit_uids;
|
|||||||
int
|
int
|
||||||
setgroups (size_t n, const gid_t *groups)
|
setgroups (size_t n, const gid_t *groups)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
|
return INLINE_SETXID_SYSCALL (setgroups32, 2, n, CHECK_N (groups, n));
|
||||||
#else
|
|
||||||
if (n > (size_t) __sysconf (_SC_NGROUPS_MAX))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
__kernel_gid_t kernel_groups[n];
|
|
||||||
|
|
||||||
# ifdef __NR_setgroups32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setgroups32, 2, n,
|
|
||||||
CHECK_N (groups, n));
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setgroups32 */
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
kernel_groups[i] = (__ptrvalue (groups))[i];
|
|
||||||
if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i]))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SETXID_SYSCALL (setgroups, 2, n,
|
|
||||||
CHECK_N (kernel_groups, n));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
libc_hidden_def (setgroups)
|
libc_hidden_def (setgroups)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,53 +19,13 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setregid32
|
|
||||||
# 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_setregid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setregid (gid_t rgid, gid_t egid)
|
__setregid (gid_t rgid, gid_t egid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
result = INLINE_SETXID_SYSCALL (setregid32, 2, rgid, egid);
|
result = INLINE_SETXID_SYSCALL (setregid32, 2, rgid, egid);
|
||||||
#else
|
|
||||||
# ifdef __NR_setregid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setregid32, 2, rgid, egid);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setregid32 */
|
|
||||||
if (((rgid + 1) > (gid_t) ((__kernel_gid_t) -1U))
|
|
||||||
|| ((egid + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setregid, 2, rgid, egid);
|
|
||||||
# ifdef __NR_setregid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2004,2005,2006
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,56 +19,14 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __NR_setresgid || defined __NR_setresgid32
|
|
||||||
|
|
||||||
# ifdef __NR_setresgid32
|
|
||||||
# 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_setresgid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setresgid (gid_t rgid, gid_t egid, gid_t sgid)
|
__setresgid (gid_t rgid, gid_t egid, gid_t sgid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresgid
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid32, 3, rgid, egid, sgid);
|
result = INLINE_SETXID_SYSCALL (setresgid32, 3, rgid, egid, sgid);
|
||||||
# else
|
|
||||||
# ifdef __NR_setresgid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid32, 3, rgid, egid, sgid);
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setresgid32 */
|
|
||||||
|
|
||||||
if (((rgid + 1) > (gid_t) ((__kernel_gid_t) -1U))
|
|
||||||
|| ((egid + 1) > (gid_t) ((__kernel_gid_t) -1U))
|
|
||||||
|| ((sgid + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid, 3, rgid, egid, sgid);
|
|
||||||
# ifdef __NR_setresgid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -77,9 +34,3 @@ libc_hidden_def (__setresgid)
|
|||||||
#ifndef __setresgid
|
#ifndef __setresgid
|
||||||
weak_alias (__setresgid, setresgid)
|
weak_alias (__setresgid, setresgid)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <posix/setresgid.c>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2004,2005,2006
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -20,56 +19,14 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __NR_setresuid || defined __NR_setresuid32
|
|
||||||
|
|
||||||
# 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 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setresuid (uid_t ruid, uid_t euid, uid_t suid)
|
__setresuid (uid_t ruid, uid_t euid, uid_t suid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresuid
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid32, 3, ruid, euid, suid);
|
result = INLINE_SETXID_SYSCALL (setresuid32, 3, ruid, euid, suid);
|
||||||
# else
|
|
||||||
# ifdef __NR_setresuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid32, 3, ruid, euid, suid);
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setresuid32 */
|
|
||||||
|
|
||||||
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)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid, 3, ruid, euid, suid);
|
|
||||||
# ifdef __NR_setresuid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -77,9 +34,3 @@ libc_hidden_def (__setresuid)
|
|||||||
#ifndef __setresuid
|
#ifndef __setresuid
|
||||||
weak_alias (__setresuid, setresuid)
|
weak_alias (__setresuid, setresuid)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <posix/setresuid.c>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,53 +19,14 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setreuid32
|
|
||||||
# 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_setreuid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setreuid (uid_t ruid, uid_t euid)
|
__setreuid (uid_t ruid, uid_t euid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
result = INLINE_SETXID_SYSCALL (setreuid32, 2, ruid, euid);
|
result = INLINE_SETXID_SYSCALL (setreuid32, 2, ruid, euid);
|
||||||
#else
|
|
||||||
# ifdef __NR_setreuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setreuid32, 2, ruid, euid);
|
|
||||||
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setreuid32 */
|
|
||||||
if (((ruid + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((euid + 1) > (uid_t) ((__kernel_uid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setreuid, 2, ruid, euid);
|
|
||||||
# ifdef __NR_setreuid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -19,53 +19,14 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __NR_setuid32
|
|
||||||
# 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_setuid32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__setuid (uid_t uid)
|
__setuid (uid_t uid)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0 && defined __NR_setuid32
|
|
||||||
result = INLINE_SETXID_SYSCALL (setuid32, 1, uid);
|
result = INLINE_SETXID_SYSCALL (setuid32, 1, uid);
|
||||||
#else
|
|
||||||
# ifdef __NR_setuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setuid32, 1, uid);
|
|
||||||
if (result == 0)
|
|
||||||
goto out;
|
|
||||||
if (errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_setuid32 */
|
|
||||||
|
|
||||||
if (uid == (uid_t) ~0
|
|
||||||
|| uid != (uid_t) ((__kernel_uid_t) uid))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SETXID_SYSCALL (setuid, 1, uid);
|
|
||||||
# ifdef __NR_setuid32
|
|
||||||
out:
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995,1997,1998,2000,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
||||||
|
|
||||||
@ -26,7 +26,6 @@
|
|||||||
#include <bits/wordsize.h>
|
#include <bits/wordsize.h>
|
||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
struct __old_shmid_ds
|
struct __old_shmid_ds
|
||||||
@ -53,14 +52,6 @@ struct __old_shminfo
|
|||||||
int shmall;
|
int shmall;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
# 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
|
|
||||||
|
|
||||||
/* Provide operations to control over shared memory segments. */
|
/* Provide operations to control over shared memory segments. */
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
||||||
int __old_shmctl (int, int, struct __old_shmid_ds *);
|
int __old_shmctl (int, int, struct __old_shmid_ds *);
|
||||||
@ -81,97 +72,8 @@ compat_symbol (libc, __old_shmctl, shmctl, GLIBC_2_0);
|
|||||||
int
|
int
|
||||||
__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
|
__new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
|
return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
|
||||||
shmid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
shmid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
||||||
#else
|
|
||||||
switch (cmd) {
|
|
||||||
case SHM_STAT:
|
|
||||||
case IPC_STAT:
|
|
||||||
case IPC_SET:
|
|
||||||
# if __WORDSIZE != 32
|
|
||||||
case IPC_INFO:
|
|
||||||
# endif
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
|
|
||||||
shmid, cmd, 0, CHECK_1 (buf));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
struct __old_shmid_ds old;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
# ifdef __NR_getuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
if (__libc_missing_32bit_uids < 0)
|
|
||||||
{
|
|
||||||
int save_errno = errno;
|
|
||||||
|
|
||||||
/* Test presence of new IPC by testing for getuid32 syscall. */
|
|
||||||
result = INLINE_SYSCALL (getuid32, 0);
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
else
|
|
||||||
__libc_missing_32bit_uids = 0;
|
|
||||||
__set_errno(save_errno);
|
|
||||||
}
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
|
|
||||||
shmid, cmd | __IPC_64, 0, CHECK_1 (buf));
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
if (cmd == IPC_SET)
|
|
||||||
{
|
|
||||||
old.shm_perm.uid = buf->shm_perm.uid;
|
|
||||||
old.shm_perm.gid = buf->shm_perm.gid;
|
|
||||||
old.shm_perm.mode = buf->shm_perm.mode;
|
|
||||||
if (old.shm_perm.uid != buf->shm_perm.uid ||
|
|
||||||
old.shm_perm.gid != buf->shm_perm.gid)
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_shmctl,
|
|
||||||
shmid, cmd, 0, __ptrvalue (&old));
|
|
||||||
if (result != -1 && (cmd == SHM_STAT || cmd == IPC_STAT))
|
|
||||||
{
|
|
||||||
memset(buf, 0, sizeof(*buf));
|
|
||||||
buf->shm_perm.__key = old.shm_perm.__key;
|
|
||||||
buf->shm_perm.uid = old.shm_perm.uid;
|
|
||||||
buf->shm_perm.gid = old.shm_perm.gid;
|
|
||||||
buf->shm_perm.cuid = old.shm_perm.cuid;
|
|
||||||
buf->shm_perm.cgid = old.shm_perm.cgid;
|
|
||||||
buf->shm_perm.mode = old.shm_perm.mode;
|
|
||||||
buf->shm_perm.__seq = old.shm_perm.__seq;
|
|
||||||
buf->shm_atime = old.shm_atime;
|
|
||||||
buf->shm_dtime = old.shm_dtime;
|
|
||||||
buf->shm_ctime = old.shm_ctime;
|
|
||||||
buf->shm_segsz = old.shm_segsz;
|
|
||||||
buf->shm_nattch = old.shm_nattch;
|
|
||||||
buf->shm_cpid = old.shm_cpid;
|
|
||||||
buf->shm_lpid = old.shm_lpid;
|
|
||||||
}
|
|
||||||
# if __WORDSIZE != 32
|
|
||||||
else if (result != -1 && cmd == IPC_INFO)
|
|
||||||
{
|
|
||||||
struct __old_shminfo *oldi = (struct __old_shminfo *)&old;
|
|
||||||
struct shminfo *i = (struct shminfo *)buf;
|
|
||||||
|
|
||||||
memset(i, 0, sizeof(*i));
|
|
||||||
i->shmmax = oldi->shmmax;
|
|
||||||
i->shmmin = oldi->shmmin;
|
|
||||||
i->shmmni = oldi->shmmni;
|
|
||||||
i->shmseg = oldi->shmseg;
|
|
||||||
i->shmall = oldi->shmall;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
|
versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
|
||||||
|
@ -37,91 +37,58 @@
|
|||||||
introduced. If somebody cares these values can afterwards be
|
introduced. If somebody cares these values can afterwards be
|
||||||
corrected. */
|
corrected. */
|
||||||
|
|
||||||
/* When did the `setresuid' syscall became available? By 2.2.0 except
|
|
||||||
on SPARC. */
|
|
||||||
#if !defined __sparc__
|
|
||||||
# define __ASSUME_SETRESUID_SYSCALL 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The sendfile syscall was introduced in 2.2.0. */
|
/* The sendfile syscall was introduced in 2.2.0. */
|
||||||
#define __ASSUME_SENDFILE 1
|
#define __ASSUME_SENDFILE 1
|
||||||
|
|
||||||
/* On x86 another `getrlimit' syscall was added in 2.3.25. */
|
/* On x86 another `getrlimit' syscall was added in 2.3.25. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131865 && defined __i386__
|
#ifdef __i386__
|
||||||
# define __ASSUME_NEW_GETRLIMIT_SYSCALL 1
|
# define __ASSUME_NEW_GETRLIMIT_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* On x86 the truncate64/ftruncate64 syscalls were introduced in 2.3.31. */
|
/* On x86 the truncate64/ftruncate64 syscalls were introduced in 2.3.31. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131871 && defined __i386__
|
#ifdef __i386__
|
||||||
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* On x86 the mmap2 syscall was introduced in 2.3.31. */
|
/* On x86 the mmap2 syscall was introduced in 2.3.31. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131871 && defined __i386__
|
#ifdef __i386__
|
||||||
# define __ASSUME_MMAP2_SYSCALL 1
|
# define __ASSUME_MMAP2_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* On x86 the stat64/lstat64/fstat64 syscalls were introduced in 2.3.34. */
|
/* On x86 the stat64/lstat64/fstat64 syscalls were introduced in 2.3.34. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131874 && defined __i386__
|
#ifdef __i386__
|
||||||
# define __ASSUME_STAT64_SYSCALL 1
|
# define __ASSUME_STAT64_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* On sparc the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64
|
/* On sparc the truncate64/ftruncate64/mmap2/stat64/lstat64/fstat64
|
||||||
syscalls were introduced in 2.3.35. */
|
syscalls were introduced in 2.3.35. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131875 \
|
#if defined __sparc__ && !defined __arch64__
|
||||||
&& (defined __sparc__ && !defined __arch64__)
|
|
||||||
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
||||||
# define __ASSUME_MMAP2_SYSCALL 1
|
# define __ASSUME_MMAP2_SYSCALL 1
|
||||||
# define __ASSUME_STAT64_SYSCALL 1
|
# define __ASSUME_STAT64_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* I know for sure that getrlimit are in 2.3.35 on powerpc. */
|
/* I know for sure that getrlimit are in 2.3.35 on powerpc. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131875 && defined __powerpc__
|
#ifdef __powerpc__
|
||||||
# define __ASSUME_NEW_GETRLIMIT_SYSCALL 1
|
# define __ASSUME_NEW_GETRLIMIT_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* I know for sure that these are in 2.3.35 on powerpc. But PowerPC64 does not
|
/* I know for sure that these are in 2.3.35 on powerpc. But PowerPC64 does not
|
||||||
support separate 64-bit syscalls, already 64-bit. */
|
support separate 64-bit syscalls, already 64-bit. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 131875 && defined __powerpc__ \
|
#if defined __powerpc__ && !defined __powerpc64__
|
||||||
&& !defined __powerpc64__
|
|
||||||
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
||||||
# define __ASSUME_STAT64_SYSCALL 1
|
# define __ASSUME_STAT64_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Linux 2.3.39 introduced 32bit UID/GIDs. Some platforms had 32
|
/* Linux 2.3.39 introduced IPC64. Except for powerpc. Linux 2.4.0 on
|
||||||
bit type all along. */
|
PPC introduced a correct IPC64. But PowerPC64 does not support a
|
||||||
#if __LINUX_KERNEL_VERSION >= 131879 || defined __powerpc__
|
separate 64-bit syscall, already 64-bit. */
|
||||||
# define __ASSUME_32BITUIDS 1
|
#ifndef __powerpc64__
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Linux 2.3.39 sparc added setresuid. */
|
|
||||||
#if __LINUX_KERNEL_VERSION >= 131879 && defined __sparc__
|
|
||||||
# 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
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We can use the LDTs for threading with Linux 2.3.99 and newer. */
|
|
||||||
#if __LINUX_KERNEL_VERSION >= 131939
|
|
||||||
# define __ASSUME_LDT_WORKS 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Linux 2.4.0 on PPC introduced a correct IPC64. But PowerPC64 does not
|
|
||||||
support a separate 64-bit syscall, already 64-bit. */
|
|
||||||
#if __LINUX_KERNEL_VERSION >= 132096 && defined __powerpc__ \
|
|
||||||
&& !defined __powerpc64__
|
|
||||||
# define __ASSUME_IPC64 1
|
# define __ASSUME_IPC64 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test. */
|
/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__
|
#ifdef __sh__
|
||||||
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
# define __ASSUME_TRUNCATE64_SYSCALL 1
|
||||||
# define __ASSUME_MMAP2_SYSCALL 1
|
# define __ASSUME_MMAP2_SYSCALL 1
|
||||||
# define __ASSUME_STAT64_SYSCALL 1
|
# define __ASSUME_STAT64_SYSCALL 1
|
||||||
@ -163,12 +130,6 @@
|
|||||||
# define __ASSUME_GETDENTS64_SYSCALL 1
|
# define __ASSUME_GETDENTS64_SYSCALL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* When did O_DIRECTORY become available? Early in 2.3 but when?
|
|
||||||
Be safe, use 2.3.99. */
|
|
||||||
#if __LINUX_KERNEL_VERSION >= 131939
|
|
||||||
# define __ASSUME_O_DIRECTORY 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Starting with one of the 2.4.0 pre-releases the Linux kernel passes
|
/* Starting with one of the 2.4.0 pre-releases the Linux kernel passes
|
||||||
up the page size information. */
|
up the page size information. */
|
||||||
#if __LINUX_KERNEL_VERSION >= 132097
|
#if __LINUX_KERNEL_VERSION >= 132097
|
||||||
|
@ -1,23 +1,16 @@
|
|||||||
/* SETxID functions which only have to change the local thread and
|
/* SETxID functions which only have to change the local thread and
|
||||||
none of the possible other threads. */
|
none of the possible other threads. */
|
||||||
#include <kernel-features.h>
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
/* If we can use the syscall directly, use it. */
|
#ifdef __NR_setresuid32
|
||||||
#if __ASSUME_32BITUIDS > 0 && defined __NR_setresuid32
|
|
||||||
# define local_seteuid(id) INLINE_SYSCALL (setresuid32, 3, -1, id, -1)
|
# define local_seteuid(id) INLINE_SYSCALL (setresuid32, 3, -1, id, -1)
|
||||||
#elif __ASSUME_SETRESUID_SYSCALL > 0
|
#else
|
||||||
# define local_seteuid(id) INLINE_SYSCALL (setresuid, 3, -1, id, -1)
|
# define local_seteuid(id) INLINE_SYSCALL (setresuid, 3, -1, id, -1)
|
||||||
#else
|
|
||||||
# define local_seteuid(id) seteuid (id)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* If we can use the syscall directly, use it. */
|
#ifdef __NR_setresgid32
|
||||||
#if __ASSUME_32BITUIDS > 0 && defined __NR_setresgid32
|
|
||||||
# define local_setegid(id) INLINE_SYSCALL (setresgid32, 3, -1, id, -1)
|
# define local_setegid(id) INLINE_SYSCALL (setresgid32, 3, -1, id, -1)
|
||||||
#elif __ASSUME_SETRESGID_SYSCALL > 0
|
|
||||||
# define local_setegid(id) INLINE_SYSCALL (setresgid, 3, -1, id, -1)
|
|
||||||
#else
|
#else
|
||||||
# define local_setegid(id) setegid (id)
|
# define local_setegid(id) INLINE_SYSCALL (setresgid, 3, -1, id, -1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -15,11 +15,6 @@
|
|||||||
License along with the GNU C Library; if not, see
|
License along with the GNU C Library; if not, see
|
||||||
<http://www.gnu.org/licenses/>. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __ASSUME_O_DIRECTORY
|
|
||||||
#define O_DIRECTORY_WORKS 1
|
#define O_DIRECTORY_WORKS 1
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sysdeps/unix/opendir.c>
|
#include <sysdeps/unix/opendir.c>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1999, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
/* Copyright (C) 1999-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -36,15 +36,8 @@ __opensock (void)
|
|||||||
const char procname[15];
|
const char procname[15];
|
||||||
} afs[] =
|
} afs[] =
|
||||||
{
|
{
|
||||||
/* The 2.2 kernels cannot handle ioctl(SIOCGIFCONF) on AF_UNIX sockets.
|
|
||||||
Give the kernel a chance to user inet sockets on old kernels. */
|
|
||||||
#if __LINUX_KERNEL_VERSION < 132096
|
|
||||||
{ AF_INET, "" },
|
|
||||||
{ AF_UNIX, "net/unix" },
|
|
||||||
#else
|
|
||||||
{ AF_UNIX, "net/unix" },
|
{ AF_UNIX, "net/unix" },
|
||||||
{ AF_INET, "" },
|
{ AF_INET, "" },
|
||||||
#endif
|
|
||||||
{ AF_INET6, "net/if_inet6" },
|
{ AF_INET6, "net/if_inet6" },
|
||||||
{ AF_AX25, "net/ax25" },
|
{ AF_AX25, "net/ax25" },
|
||||||
{ AF_NETROM, "net/nr" },
|
{ AF_NETROM, "net/nr" },
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000,2001,2002,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -24,7 +24,6 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
In Linux 2.1.x the chown functions have been changed. A new function lchown
|
In Linux 2.1.x the chown functions have been changed. A new function lchown
|
||||||
@ -38,58 +37,12 @@
|
|||||||
|
|
||||||
/* Running under Linux > 2.1.80. */
|
/* Running under Linux > 2.1.80. */
|
||||||
|
|
||||||
#ifdef __NR_chown32
|
/* Consider moving to syscalls.list. */
|
||||||
# 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_chown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__real_chown (const char *file, uid_t owner, gid_t group)
|
__real_chown (const char *file, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
||||||
#else
|
|
||||||
static int __libc_old_chown;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if (!__libc_old_chown)
|
|
||||||
{
|
|
||||||
int saved_errno = errno;
|
|
||||||
# ifdef __NR_chown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_chown32 */
|
|
||||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
||||||
|
|
||||||
if (result >= 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_old_chown = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return __lchown (file, owner, group);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2000, 2001, 2003, 2006 Free Software Foundation, Inc.
|
/* Copyright (C) 2000-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,46 +23,13 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
# ifdef __NR_lchown32
|
/* Consider moving to syscalls.list. */
|
||||||
# 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_lchown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__lchown (const char *file, uid_t owner, gid_t group)
|
__lchown (const char *file, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
# if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
return INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
||||||
# else
|
|
||||||
# ifdef __NR_lchown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (lchown32, 3, CHECK_STRING (file), owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_lchown32 */
|
|
||||||
|
|
||||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SYSCALL (lchown, 3, CHECK_STRING (file), owner, group);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias (__lchown, lchown)
|
weak_alias (__lchown, lchown)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -18,13 +18,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __NR_setresgid || __ASSUME_SETRESGID_SYSCALL > 0
|
|
||||||
|
|
||||||
extern int __setresgid (gid_t rgid, gid_t egid, gid_t sgid);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
setegid (gid_t gid)
|
setegid (gid_t gid)
|
||||||
{
|
{
|
||||||
@ -36,18 +31,10 @@ setegid (gid_t gid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if __ASSUME_32BITUIDS > 0 && defined __NR_setresgid32
|
#ifdef __NR_setresgid32
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
|
result = INLINE_SETXID_SYSCALL (setresgid32, 3, -1, gid, -1);
|
||||||
#else
|
#else
|
||||||
/* First try the syscall. */
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresgid, 3, -1, gid, -1);
|
result = INLINE_SETXID_SYSCALL (setresgid, 3, -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
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -55,6 +42,3 @@ setegid (gid_t gid)
|
|||||||
#ifndef setegid
|
#ifndef setegid
|
||||||
libc_hidden_def (setegid)
|
libc_hidden_def (setegid)
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
# include <sysdeps/unix/bsd/setegid.c>
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,1999,2002,2003,2004,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -18,13 +18,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <setxid.h>
|
#include <setxid.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __NR_setresuid || __ASSUME_SETRESUID_SYSCALL > 0
|
|
||||||
|
|
||||||
extern int __setresuid (uid_t ruid, uid_t euid, uid_t suid);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
seteuid (uid_t uid)
|
seteuid (uid_t uid)
|
||||||
{
|
{
|
||||||
@ -36,18 +31,10 @@ seteuid (uid_t uid)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if __ASSUME_32BITUIDS > 0 && defined __NR_setresuid32
|
#ifdef __NR_setresuid32
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);
|
result = INLINE_SETXID_SYSCALL (setresuid32, 3, -1, uid, -1);
|
||||||
#else
|
#else
|
||||||
/* First try the syscall. */
|
|
||||||
result = INLINE_SETXID_SYSCALL (setresuid, 3, -1, uid, -1);
|
result = INLINE_SETXID_SYSCALL (setresuid, 3, -1, uid, -1);
|
||||||
# if __ASSUME_SETRESUID_SYSCALL == 0
|
|
||||||
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);
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -55,6 +42,3 @@ seteuid (uid_t uid)
|
|||||||
#ifndef seteuid
|
#ifndef seteuid
|
||||||
libc_hidden_def (seteuid)
|
libc_hidden_def (seteuid)
|
||||||
#endif
|
#endif
|
||||||
#else
|
|
||||||
# include <sysdeps/unix/bsd/seteuid.c>
|
|
||||||
#endif
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1998,2000,2002,2003,2006 Free Software Foundation, Inc.
|
/* Copyright (C) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -23,46 +23,13 @@
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
|
|
||||||
#include <linux/posix_types.h>
|
#include <linux/posix_types.h>
|
||||||
#include <kernel-features.h>
|
|
||||||
|
|
||||||
#ifdef __NR_chown32
|
/* Consider moving to syscalls.list. */
|
||||||
# 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_chown32 */
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__chown (const char *file, uid_t owner, gid_t group)
|
__chown (const char *file, uid_t owner, gid_t group)
|
||||||
{
|
{
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
||||||
#else
|
|
||||||
# ifdef __NR_chown32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
int saved_errno = errno;
|
|
||||||
|
|
||||||
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
||||||
if (result == 0 || errno != ENOSYS)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
__set_errno (saved_errno);
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
}
|
|
||||||
# endif /* __NR_chown32 */
|
|
||||||
|
|
||||||
if (((owner + 1) > (gid_t) ((__kernel_uid_t) -1U))
|
|
||||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
libc_hidden_def (__chown)
|
libc_hidden_def (__chown)
|
||||||
weak_alias (__chown, chown)
|
weak_alias (__chown, chown)
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/* Semctl for architectures where word sized unions are passed indirectly
|
/* Semctl for architectures where word sized unions are passed indirectly
|
||||||
Copyright (C) 1995,1997,1998,2000,2002,2003,2004,2006
|
Copyright (C) 1995-2012 Free Software Foundation, Inc.
|
||||||
Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
|
||||||
|
|
||||||
@ -27,7 +26,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include <kernel-features.h>
|
|
||||||
#include <shlib-compat.h>
|
#include <shlib-compat.h>
|
||||||
|
|
||||||
struct __old_semid_ds
|
struct __old_semid_ds
|
||||||
@ -55,14 +53,6 @@ union semun
|
|||||||
#include <bp-checks.h>
|
#include <bp-checks.h>
|
||||||
#include <bp-semctl.h> /* definition of CHECK_SEMCTL needs union semum */
|
#include <bp-semctl.h> /* definition of CHECK_SEMCTL needs union semum */
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
# 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
|
|
||||||
|
|
||||||
/* Return identifier for array of NSEMS semaphores associated with
|
/* Return identifier for array of NSEMS semaphores associated with
|
||||||
KEY. */
|
KEY. */
|
||||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
|
||||||
@ -126,82 +116,8 @@ __new_semctl (int semid, int semnum, int cmd, ...)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __ASSUME_32BITUIDS > 0
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
||||||
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
||||||
#else
|
|
||||||
switch (cmd) {
|
|
||||||
case SEM_STAT:
|
|
||||||
case IPC_STAT:
|
|
||||||
case IPC_SET:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int result;
|
|
||||||
struct __old_semid_ds old;
|
|
||||||
struct semid_ds *buf;
|
|
||||||
|
|
||||||
#ifdef __NR_getuid32
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
if (__libc_missing_32bit_uids < 0)
|
|
||||||
{
|
|
||||||
int save_errno = errno;
|
|
||||||
|
|
||||||
/* Test presence of new IPC by testing for getuid32 syscall. */
|
|
||||||
result = INLINE_SYSCALL (getuid32, 0);
|
|
||||||
if (result == -1 && errno == ENOSYS)
|
|
||||||
__libc_missing_32bit_uids = 1;
|
|
||||||
else
|
|
||||||
__libc_missing_32bit_uids = 0;
|
|
||||||
__set_errno(save_errno);
|
|
||||||
}
|
|
||||||
if (__libc_missing_32bit_uids <= 0)
|
|
||||||
{
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd | __IPC_64));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buf = arg.buf;
|
|
||||||
arg.__old_buf = &old;
|
|
||||||
if (cmd == IPC_SET)
|
|
||||||
{
|
|
||||||
old.sem_perm.uid = buf->sem_perm.uid;
|
|
||||||
old.sem_perm.gid = buf->sem_perm.gid;
|
|
||||||
old.sem_perm.mode = buf->sem_perm.mode;
|
|
||||||
if (old.sem_perm.uid != buf->sem_perm.uid ||
|
|
||||||
old.sem_perm.gid != buf->sem_perm.gid)
|
|
||||||
{
|
|
||||||
__set_errno (EINVAL);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd,
|
|
||||||
CHECK_SEMCTL (&arg, semid, cmd));
|
|
||||||
if (result != -1 && cmd != IPC_SET)
|
|
||||||
{
|
|
||||||
memset(buf, 0, sizeof(*buf));
|
|
||||||
buf->sem_perm.__key = old.sem_perm.__key;
|
|
||||||
buf->sem_perm.uid = old.sem_perm.uid;
|
|
||||||
buf->sem_perm.gid = old.sem_perm.gid;
|
|
||||||
buf->sem_perm.cuid = old.sem_perm.cuid;
|
|
||||||
buf->sem_perm.cgid = old.sem_perm.cgid;
|
|
||||||
buf->sem_perm.mode = old.sem_perm.mode;
|
|
||||||
buf->sem_perm.__seq = old.sem_perm.__seq;
|
|
||||||
buf->sem_otime = old.sem_otime;
|
|
||||||
buf->sem_ctime = old.sem_ctime;
|
|
||||||
buf->sem_nsems = old.sem_nsems;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
|
versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
|
||||||
|
Loading…
Reference in New Issue
Block a user