aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessio Balsini <balsini@android.com>2021-06-25 13:54:47 +0200
committerAlessio Balsini <balsini@google.com>2021-06-28 11:04:02 +0100
commitd8fb78b33624ef3709e6990066d25b971d291439 (patch)
treedc99b8d2649bf2bbdb34cad32c778ac254a47634
parent15ae46528acd0f9608d711129bd6435a0183afb8 (diff)
downloadltp-d8fb78b33624ef3709e6990066d25b971d291439.tar.gz
UPSTREAM: getrlimit/getrlimit03: fix deprecated __NR_getrlimit for armandroid12-dev
__NR_getrlimit has been deprecated from arm EABI, and is only available if the OABI_COMPAT config option is defined. This may cause failures with the current test as it assumes that __NR_getrlimit always exists if __NR_ugetrlimit is defined, but this assumption does not hold anymore. Catch this exception by testing if __NR_getrlimit is defined and the target is arm. Fixes: #819 Signed-off-by: Alessio Balsini <balsini@android.com> Reviewed-by: Cyril Hrubis <chrubis@suse.cz> Signed-off-by: Alessio Balsini <balsini@google.com> Bug: 189291971 Test: atest vts_ltp_test_arm_lowmem:syscalls.getrlimit03_32bit (cherry picked from commit b62557c134e934b1f1b1eef8492e6e65ff5e6551) Change-Id: Iadbaf4fa9574878f64094ff1212ab14584b90518 Merged-In: Iadbaf4fa9574878f64094ff1212ab14584b90518
-rw-r--r--testcases/kernel/syscalls/getrlimit/getrlimit03.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/testcases/kernel/syscalls/getrlimit/getrlimit03.c b/testcases/kernel/syscalls/getrlimit/getrlimit03.c
index 319bc494a..604082ccf 100644
--- a/testcases/kernel/syscalls/getrlimit/getrlimit03.c
+++ b/testcases/kernel/syscalls/getrlimit/getrlimit03.c
@@ -35,14 +35,20 @@
* The underlying syscall names vary across architectures, depending on whether
* the architecture predates the "new" handler. For clarity, this test
* will call them getrlimit_long and getlimit_ulong internally.
+ *
+ * __NR_getrlimit has been deprecated from arm EABI and moved to OABI_COMPAT,
+ * so the syscall on arm may or may not be available even if __NR_ugetrlimit
+ * exists.
*/
-#define SIGNED_GETRLIMIT (__NR_ugetrlimit != __LTP__NR_INVALID_SYSCALL)
-#if SIGNED_GETRLIMIT
-#define __NR_getrlimit_ulong __NR_ugetrlimit
-#define __NR_getrlimit_ulong_str "__NR_ugetrlimit"
+#if __NR_ugetrlimit != __LTP__NR_INVALID_SYSCALL
+# if !defined(__arm__) || __NR_getrlimit != __LTP__NR_INVALID_SYSCALL
+# define SIGNED_GETRLIMIT
+# endif
+# define __NR_getrlimit_ulong __NR_ugetrlimit
+# define __NR_getrlimit_ulong_str "__NR_ugetrlimit"
#else
-#define __NR_getrlimit_ulong __NR_getrlimit
-#define __NR_getrlimit_ulong_str "__NR_getrlimit"
+# define __NR_getrlimit_ulong __NR_getrlimit
+# define __NR_getrlimit_ulong_str "__NR_getrlimit"
#endif
#ifndef HAVE_STRUCT_RLIMIT64
@@ -74,12 +80,13 @@ static int getrlimit_ulong(int resource, struct rlimit_ulong *rlim)
return syscall(__NR_getrlimit_ulong, resource, rlim);
}
-#if SIGNED_GETRLIMIT
+const long RLIM_INFINITY_L = LONG_MAX;
+
+#ifdef SIGNED_GETRLIMIT
struct rlimit_long {
long rlim_cur;
long rlim_max;
};
-const long RLIM_INFINITY_L = LONG_MAX;
static int getrlimit_long(int resource, struct rlimit_long *rlim)
{
@@ -116,7 +123,7 @@ static int compare_u64_ulong(int resource, uint64_t val_u64,
return 0;
}
-#if SIGNED_GETRLIMIT
+#ifdef SIGNED_GETRLIMIT
static int compare_u64_long(int resource, uint64_t val_u64, long val_l,
const char *kind)
{
@@ -142,7 +149,7 @@ static void run(unsigned int resource)
int ret_ul;
int errno_ul;
-#if SIGNED_GETRLIMIT
+#ifdef SIGNED_GETRLIMIT
struct rlimit_long rlim_l;
int ret_l;
int errno_l;
@@ -167,7 +174,7 @@ static void run(unsigned int resource)
tst_res(TPASS, "__NR_prlimit64(%d) and %s(%d) gave consistent results",
resource, __NR_getrlimit_ulong_str, resource);
-#if SIGNED_GETRLIMIT
+#ifdef SIGNED_GETRLIMIT
errno = 0;
ret_l = getrlimit_long(resource, &rlim_l);
errno_l = errno;