mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 14:20:07 +00:00
Alpha: Fix the RLIM_INFINITY and RLIM64_INFINITY constants
Fix the RLIM_INFINITY and RLIM64_INFINITY constants on alpha to match the kernel one and all other architectures. Change the getrlimit, getrlimit64, setrlimit, setrlimit64 into old compat symbols, and provide the Linux generic functions as GLIBC_2_27 version. Changelog: * sysdeps/unix/sysv/linux/getrlimit64.c [USE_VERSIONED_RLIMIT]: Do not define getrlimit and getrlimit64 as weak aliases of __getrlimit64. Define __GI_getrlimit64 as weak alias of __getrlimit64. [__RLIM_T_MATCHES_RLIM64_T]: Do not redefine SHLIB_COMPAT, use #elif instead. * sysdeps/unix/sysv/linux/setrlimit64.c [USE_VERSIONED_RLIMIT]: Do not define setrlimit and setrlimit64 as weak aliases of __setrlimit64. * sysdeps/unix/sysv/linux/alpha/bits/resource.h (RLIM_INFINITY, RLIM64_INFINITY): Fix values to match the kernel ones. * sysdeps/unix/sysv/linux/alpha/getrlimit64.c: Define USE_VERSIONED_RLIMIT. Rename __getrlimit64 into __old_getrlimit64 and provide it as getrlimit@@GLIBC_2_0 and getrlimit64@@GLIBC_2_1. Add a __getrlimit64 function and provide it as getrlimit@@GLIBC_2_27 and getrlimit64@@GLIBC_2_27. * sysdeps/unix/sysv/linux/alpha/setrlimit64.c: Ditto with setrlimit and setrlimit64. * sysdeps/unix/sysv/linux/alpha/libc.abilist (GLIBC_2.27): Add getrlimit, setrlimit, getrlimit64 and setrlimit64. * sysdeps/unix/sysv/linux/alpha/Versions (libc): Add getrlimit, setrlimit, getrlimit64 and setrlimit64.
This commit is contained in:
parent
0d0bc784ca
commit
8e900969db
24
ChangeLog
24
ChangeLog
@ -1,3 +1,27 @@
|
||||
2018-01-05 Aurelien Jarno <aurelien@aurel32.net>
|
||||
Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
* sysdeps/unix/sysv/linux/getrlimit64.c [USE_VERSIONED_RLIMIT]: Do not
|
||||
define getrlimit and getrlimit64 as weak aliases of __getrlimit64.
|
||||
Define __GI_getrlimit64 as weak alias of __getrlimit64.
|
||||
[__RLIM_T_MATCHES_RLIM64_T]: Do not redefine SHLIB_COMPAT, use #elif
|
||||
instead.
|
||||
* sysdeps/unix/sysv/linux/setrlimit64.c [USE_VERSIONED_RLIMIT]: Do not
|
||||
define setrlimit and setrlimit64 as weak aliases of __setrlimit64.
|
||||
* sysdeps/unix/sysv/linux/alpha/bits/resource.h (RLIM_INFINITY,
|
||||
RLIM64_INFINITY): Fix values to match the kernel ones.
|
||||
* sysdeps/unix/sysv/linux/alpha/getrlimit64.c: Define
|
||||
USE_VERSIONED_RLIMIT. Rename __getrlimit64 into __old_getrlimit64 and
|
||||
provide it as getrlimit@@GLIBC_2_0 and getrlimit64@@GLIBC_2_1. Add a
|
||||
__getrlimit64 function and provide it as getrlimit@@GLIBC_2_27 and
|
||||
getrlimit64@@GLIBC_2_27.
|
||||
* sysdeps/unix/sysv/linux/alpha/setrlimit64.c: Ditto with setrlimit
|
||||
and setrlimit64.
|
||||
* sysdeps/unix/sysv/linux/alpha/libc.abilist (GLIBC_2.27): Add
|
||||
getrlimit, setrlimit, getrlimit64 and setrlimit64.
|
||||
* sysdeps/unix/sysv/linux/alpha/Versions (libc): Add getrlimit,
|
||||
setrlimit, getrlimit64 and setrlimit64.
|
||||
|
||||
2018-01-05 Aurelien Jarno <aurelien@aurel32.net>
|
||||
|
||||
[BZ #22648]
|
||||
|
@ -85,6 +85,9 @@ libc {
|
||||
#errlist-compat 140
|
||||
_sys_errlist; sys_errlist; _sys_nerr; sys_nerr;
|
||||
}
|
||||
GLIBC_2.27 {
|
||||
getrlimit; setrlimit; getrlimit64; setrlimit64;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__libc_alpha_cache_shape;
|
||||
}
|
||||
|
@ -112,13 +112,13 @@ enum __rlimit_resource
|
||||
|
||||
/* Value to indicate that there is no limit. */
|
||||
#ifndef __USE_FILE_OFFSET64
|
||||
# define RLIM_INFINITY ((long int)(~0UL >> 1))
|
||||
# define RLIM_INFINITY ((__rlim_t) -1)
|
||||
#else
|
||||
# define RLIM_INFINITY 0x7fffffffffffffffLL
|
||||
# define RLIM_INFINITY 0xffffffffffffffffuLL
|
||||
#endif
|
||||
|
||||
#ifdef __USE_LARGEFILE64
|
||||
# define RLIM64_INFINITY 0x7fffffffffffffffLL
|
||||
# define RLIM64_INFINITY 0xffffffffffffffffuLL
|
||||
#endif
|
||||
|
||||
/* We can represent all limits. */
|
||||
|
@ -15,50 +15,42 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Add this redirection so the strong_alias linking getrlimit64 to
|
||||
{__}getrlimit does not throw a type error. */
|
||||
#undef getrlimit
|
||||
#undef __getrlimit
|
||||
#define getrlimit getrlimit_redirect
|
||||
#define __getrlimit __getrlimit_redirect
|
||||
#include <sys/resource.h>
|
||||
#undef getrlimit
|
||||
#undef __getrlimit
|
||||
#define USE_VERSIONED_RLIMIT
|
||||
#include <sysdeps/unix/sysv/linux/getrlimit64.c>
|
||||
versioned_symbol (libc, __getrlimit, getrlimit, GLIBC_2_27);
|
||||
versioned_symbol (libc, __getrlimit64, getrlimit64, GLIBC_2_27);
|
||||
|
||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_27)
|
||||
/* RLIM64_INFINITY was supposed to be a glibc convention rather than
|
||||
anything seen by the kernel, but it ended being passed to the kernel
|
||||
through the prlimit64 syscall. Given that a lot of binaries with
|
||||
the wrong constant value are in the wild, provide a wrapper function
|
||||
fixing the value after the syscall. */
|
||||
#define KERNEL_RLIM64_INFINITY 0xffffffffffffffffULL
|
||||
# define OLD_RLIM64_INFINITY 0x7fffffffffffffffULL
|
||||
|
||||
int
|
||||
__getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits)
|
||||
attribute_compat_text_section
|
||||
__old_getrlimit64 (enum __rlimit_resource resource,
|
||||
struct rlimit64 *rlimits)
|
||||
{
|
||||
struct rlimit64 krlimits;
|
||||
|
||||
if (INLINE_SYSCALL_CALL (prlimit64, 0, resource, NULL, &krlimits) < 0)
|
||||
if (__getrlimit64 (resource, &krlimits) < 0)
|
||||
return -1;
|
||||
|
||||
if (krlimits.rlim_cur == KERNEL_RLIM64_INFINITY)
|
||||
rlimits->rlim_cur = RLIM64_INFINITY;
|
||||
if (krlimits.rlim_cur == RLIM64_INFINITY)
|
||||
rlimits->rlim_cur = OLD_RLIM64_INFINITY;
|
||||
else
|
||||
rlimits->rlim_cur = krlimits.rlim_cur;
|
||||
if (krlimits.rlim_max == KERNEL_RLIM64_INFINITY)
|
||||
rlimits->rlim_max = RLIM64_INFINITY;
|
||||
if (krlimits.rlim_max == RLIM64_INFINITY)
|
||||
rlimits->rlim_max = OLD_RLIM64_INFINITY;
|
||||
else
|
||||
rlimits->rlim_max = krlimits.rlim_max;
|
||||
|
||||
return 0;
|
||||
}
|
||||
libc_hidden_def (__getrlimit64)
|
||||
strong_alias (__getrlimit64, __GI_getrlimit)
|
||||
strong_alias (__getrlimit64, __GI___getrlimit)
|
||||
strong_alias (__getrlimit64, __getrlimit)
|
||||
weak_alias (__getrlimit64, getrlimit)
|
||||
|
||||
weak_alias (__getrlimit64, getrlimit64)
|
||||
libc_hidden_weak (getrlimit64)
|
||||
strong_alias (__old_getrlimit64, __old_getrlimit)
|
||||
compat_symbol (libc, __old_getrlimit, getrlimit, GLIBC_2_0);
|
||||
compat_symbol (libc, __old_getrlimit64, getrlimit64, GLIBC_2_1);
|
||||
#endif
|
||||
|
@ -2016,6 +2016,8 @@ GLIBC_2.26 pwritev64v2 F
|
||||
GLIBC_2.26 reallocarray F
|
||||
GLIBC_2.27 GLIBC_2.27 A
|
||||
GLIBC_2.27 copy_file_range F
|
||||
GLIBC_2.27 getrlimit F
|
||||
GLIBC_2.27 getrlimit64 F
|
||||
GLIBC_2.27 glob F
|
||||
GLIBC_2.27 glob64 F
|
||||
GLIBC_2.27 memfd_create F
|
||||
@ -2025,6 +2027,8 @@ GLIBC_2.27 pkey_free F
|
||||
GLIBC_2.27 pkey_get F
|
||||
GLIBC_2.27 pkey_mprotect F
|
||||
GLIBC_2.27 pkey_set F
|
||||
GLIBC_2.27 setrlimit F
|
||||
GLIBC_2.27 setrlimit64 F
|
||||
GLIBC_2.27 strfromf128 F
|
||||
GLIBC_2.27 strfromf32 F
|
||||
GLIBC_2.27 strfromf32x F
|
||||
|
@ -15,47 +15,39 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Add this redirection so the strong_alias linking setrlimit64 to
|
||||
{__}setrlimit does not throw a type error. */
|
||||
#undef setrlimit
|
||||
#undef __setrlimit
|
||||
#define setrlimit setrlimit_redirect
|
||||
#define __setrlimit __setrlimit_redirect
|
||||
#include <sys/resource.h>
|
||||
#undef setrlimit
|
||||
#undef __setrlimit
|
||||
#define USE_VERSIONED_RLIMIT
|
||||
#include <sysdeps/unix/sysv/linux/setrlimit64.c>
|
||||
versioned_symbol (libc, __setrlimit, setrlimit, GLIBC_2_27);
|
||||
versioned_symbol (libc, __setrlimit64, setrlimit64, GLIBC_2_27);
|
||||
|
||||
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_27)
|
||||
/* RLIM64_INFINITY was supposed to be a glibc convention rather than
|
||||
anything seen by the kernel, but it ended being passed to the kernel
|
||||
through the prlimit64 syscall. Given that a lot of binaries with
|
||||
the wrong constant value are in the wild, provide a wrapper function
|
||||
fixing the value before the syscall. */
|
||||
#define KERNEL_RLIM64_INFINITY 0xffffffffffffffffULL
|
||||
# define OLD_RLIM64_INFINITY 0x7fffffffffffffffULL
|
||||
|
||||
int
|
||||
__setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits)
|
||||
attribute_compat_text_section
|
||||
__old_setrlimit64 (enum __rlimit_resource resource,
|
||||
const struct rlimit64 *rlimits)
|
||||
{
|
||||
struct rlimit64 krlimits;
|
||||
|
||||
if (rlimits->rlim_cur == RLIM64_INFINITY)
|
||||
krlimits.rlim_cur = KERNEL_RLIM64_INFINITY;
|
||||
if (rlimits->rlim_cur == OLD_RLIM64_INFINITY)
|
||||
krlimits.rlim_cur = RLIM64_INFINITY;
|
||||
else
|
||||
krlimits.rlim_cur = rlimits->rlim_cur;
|
||||
if (rlimits->rlim_max == RLIM64_INFINITY)
|
||||
krlimits.rlim_max = KERNEL_RLIM64_INFINITY;
|
||||
if (rlimits->rlim_max == OLD_RLIM64_INFINITY)
|
||||
krlimits.rlim_max = RLIM64_INFINITY;
|
||||
else
|
||||
krlimits.rlim_max = rlimits->rlim_max;
|
||||
|
||||
return INLINE_SYSCALL_CALL (prlimit64, 0, resource, &krlimits, NULL);
|
||||
return __setrlimit64 (resource, &krlimits);
|
||||
}
|
||||
|
||||
weak_alias (__setrlimit64, setrlimit64)
|
||||
|
||||
strong_alias (__setrlimit64, __setrlimit)
|
||||
weak_alias (__setrlimit64, setrlimit)
|
||||
#ifdef SHARED
|
||||
__hidden_ver1 (__setrlimit64, __GI___setrlimit, __setrlimit64);
|
||||
strong_alias (__old_setrlimit64, __old_setrlimit)
|
||||
compat_symbol (libc, __old_setrlimit, setrlimit, GLIBC_2_0);
|
||||
compat_symbol (libc, __old_setrlimit64, setrlimit64, GLIBC_2_1);
|
||||
#endif
|
||||
|
@ -45,13 +45,16 @@ libc_hidden_def (__getrlimit64)
|
||||
strong_alias (__getrlimit64, __GI_getrlimit)
|
||||
strong_alias (__getrlimit64, __GI___getrlimit)
|
||||
strong_alias (__getrlimit64, __getrlimit)
|
||||
/* Alpha defines a versioned getrlimit{64}. */
|
||||
# ifndef USE_VERSIONED_RLIMIT
|
||||
weak_alias (__getrlimit64, getrlimit)
|
||||
/* And there is no need for compat symbols. */
|
||||
# undef SHLIB_COMPAT
|
||||
# define SHLIB_COMPAT(a, b, c) 0
|
||||
#endif
|
||||
weak_alias (__getrlimit64, getrlimit64)
|
||||
libc_hidden_weak (getrlimit64)
|
||||
# else
|
||||
weak_alias (__getrlimit64, __GI_getrlimit64)
|
||||
# endif
|
||||
|
||||
#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
|
||||
#elif SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
|
||||
/* Back compatible 2GiB limited rlimit. */
|
||||
extern int __new_getrlimit (enum __rlimit_resource, struct rlimit *)
|
||||
attribute_hidden;
|
||||
@ -78,7 +81,4 @@ __old_getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits)
|
||||
}
|
||||
versioned_symbol (libc, __getrlimit64, getrlimit64, GLIBC_2_2);
|
||||
compat_symbol (libc, __old_getrlimit64, getrlimit64, GLIBC_2_1);
|
||||
#else
|
||||
weak_alias (__getrlimit64, getrlimit64)
|
||||
libc_hidden_weak (getrlimit64)
|
||||
#endif
|
||||
#endif /* __RLIM_T_MATCHES_RLIM64_T */
|
||||
|
@ -38,11 +38,16 @@ __setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits)
|
||||
{
|
||||
return INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL);
|
||||
}
|
||||
/* Alpha defines a versioned setrlimit{64}. */
|
||||
#ifndef USE_VERSIONED_RLIMIT
|
||||
weak_alias (__setrlimit64, setrlimit64)
|
||||
#endif
|
||||
|
||||
#if __RLIM_T_MATCHES_RLIM64_T
|
||||
strong_alias (__setrlimit64, __setrlimit)
|
||||
# ifndef USE_VERSIONED_RLIMIT
|
||||
weak_alias (__setrlimit64, setrlimit)
|
||||
# endif
|
||||
# ifdef SHARED
|
||||
__hidden_ver1 (__setrlimit64, __GI___setrlimit, __setrlimit64);
|
||||
# endif
|
||||
|
Loading…
Reference in New Issue
Block a user