From 4bf3912213ed8d0fa937fb4784a3e8e0c8fd8c3c Mon Sep 17 00:00:00 2001 From: Pavel Kozlov Date: Tue, 7 Nov 2023 15:03:12 +0400 Subject: prlimit: add name redirection and fix incorrect parameters to syscall The tst-rlimit/tst-rlimit64 tests pointed to several issueses in prlimit() function for 32-bit CPUs. This patch adds name redirection to prlimit64 in prlimit declaration to provide correct support for 64-bit offset (_FILE_OFFSET_BITS=64) on 32-bit CPUs and fixes improper field assignment and incorrect syscall paramerets in the prlimit() function. Fixes: 8c2f6218 ("setrlimit/getrlimit: fix prlimit64 syscall use for 32-bit CPUs") Signed-off-by: Pavel Kozlov --- libc/sysdeps/linux/common/prlimit.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'libc') diff --git a/libc/sysdeps/linux/common/prlimit.c b/libc/sysdeps/linux/common/prlimit.c index f59ade3a3..81c0f4619 100644 --- a/libc/sysdeps/linux/common/prlimit.c +++ b/libc/sysdeps/linux/common/prlimit.c @@ -25,7 +25,9 @@ prlimit (__pid_t pid, enum __rlimit_resource resource, const struct rlimit *new_rlimit, struct rlimit *old_rlimit) { struct rlimit64 new_rlimit64; + struct rlimit64 *new_rlimit64_ptr = NULL; struct rlimit64 old_rlimit64; + struct rlimit64 *old_rlimit64_ptr = (old_rlimit != NULL ? &old_rlimit64 : NULL); int res; if (new_rlimit != NULL) { @@ -37,10 +39,11 @@ prlimit (__pid_t pid, enum __rlimit_resource resource, new_rlimit64.rlim_max = RLIM64_INFINITY; else new_rlimit64.rlim_max = new_rlimit->rlim_max; + new_rlimit64_ptr = &new_rlimit64; } - res = INLINE_SYSCALL (prlimit64, 4, pid, resource, &new_rlimit64, - &old_rlimit64); + res = INLINE_SYSCALL (prlimit64, 4, pid, resource, new_rlimit64_ptr, + old_rlimit64_ptr); if (res == 0 && old_rlimit != NULL) { /* If the syscall succeeds but the values do not fit into a @@ -64,7 +67,7 @@ prlimit (__pid_t pid, enum __rlimit_resource resource, __set_errno(EOVERFLOW); return -1; } - old_rlimit->rlim_cur = RLIM_INFINITY; + old_rlimit->rlim_max = RLIM_INFINITY; } } -- cgit v1.2.3