Remove pre-2.4 Linux kernel support.

This commit is contained in:
Joseph Myers 2012-05-25 19:19:30 +00:00
parent a386f1cc22
commit 21708942c9
39 changed files with 240 additions and 1426 deletions

160
ChangeLog
View File

@ -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
View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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
} }

View File

@ -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)

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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)

View File

@ -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;
} }

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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" },

View File

@ -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
} }

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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);