]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 508779 - PRE(sys_prlimit64): reorder check for memory validity
authorMatthias Schwarzott <zzam@gentoo.org>
Sat, 23 Aug 2025 11:37:46 +0000 (13:37 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Fri, 29 Aug 2025 19:42:42 +0000 (21:42 +0200)
so all errors are displayed and not just the first

NEWS
coregrind/m_syswrap/syswrap-linux.c
memcheck/tests/amd64-linux/scalar.c
memcheck/tests/amd64-linux/scalar.stderr.exp
memcheck/tests/x86-linux/scalar.c
memcheck/tests/x86-linux/scalar.stderr.exp

diff --git a/NEWS b/NEWS
index 0d6e10ee9072008796ff6a9ad7e5df35a32e5a40..b1f4d8d11a335a10cd3830101d8ef978de82da61 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -89,6 +89,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 508638  Self-hosting not working on FreeBSD
 508777  amd64-linux: add minimal scalar test
 508778  syscall-wrapper waitid warns about infop=null
+508779  PRE(sys_prlimit64): reorder check for memory validity
 508869  x86-linux: simplify scalar test output
 
 To see details of a given bug, visit
index a740912f802ba0307939f94203b287dea118fb6d..785031c108221bcffa9e581d8d4c5c0f9bf2c87c 100644 (file)
@@ -2307,17 +2307,15 @@ PRE(sys_prlimit64)
                  struct rlimit64 *, old_rlim);
    if (ARG3) {
       PRE_MEM_READ( "rlimit64(new_rlim)", ARG3, sizeof(struct vki_rlimit64) );
-      if (!ML_(safe_to_deref)((void*)(Addr)ARG3, sizeof(struct vki_rlimit64))) {
-         SET_STATUS_Failure(VKI_EFAULT);
-         return;
-      }
    }
    if (ARG4) {
       PRE_MEM_WRITE( "rlimit64(old_rlim)", ARG4, sizeof(struct vki_rlimit64) );
-      if (!ML_(safe_to_deref)((void*)(Addr)ARG4, sizeof(struct vki_rlimit64))) {
-         SET_STATUS_Failure(VKI_EFAULT);
-         return;
-      }
+   }
+
+   if ((ARG3 && !ML_(safe_to_deref)((void*)(Addr)ARG3, sizeof(struct vki_rlimit64)))
+       || (ARG4 && !ML_(safe_to_deref)((void*)(Addr)ARG4, sizeof(struct vki_rlimit64)))) {
+      SET_STATUS_Failure(VKI_EFAULT);
+      return;
    }
 
    if (ARG3 &&
index 5167fde2d773bd0e822d8696d205270b4ea76d02..fe133d8d2a2bfaa0a7bd7fe519b3d0cb33b6f7d3 100644 (file)
@@ -3,6 +3,7 @@
 #include "../../memcheck.h"
 #include "scalar.h"
 #include <unistd.h>
+#include <sys/resource.h>
 
 // Here we are trying to trigger every syscall error (scalar errors and
 // memory errors) for every syscall.  We do this by passing a lot of bogus
@@ -45,6 +46,14 @@ int main(void)
    GO(__NR_exit, "below");
    // (see below)
 
+   // __NR_getrlimit 97
+   GO(__NR_getrlimit, "2s 1m");
+   SY(__NR_getrlimit, x0, x0); FAIL;
+
+   // __NR_setrlimit 160
+   GO(__NR_setrlimit, "2s 1m");
+   SY(__NR_setrlimit, x0, x0); FAILx(EFAULT);
+
   // __NR_waitid 247
    GO(__NR_waitid, "5s 0m");
    SY(__NR_waitid, x0, x0, x0, x0, x0); FAIL;
@@ -52,6 +61,19 @@ int main(void)
    GO(__NR_waitid, "(infop,ru) 5s 2m");
    SY(__NR_waitid, x0, x0, x0 + 1, x0, x0 + 1); FAIL;
 
+   // __NR_prlimit64 302
+   GO(__NR_prlimit64, "(nop) 4s 0m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0, x0); SUCC;
+
+   GO(__NR_prlimit64, "(set) 4s 1m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0 + 1, x0); FAILx(EFAULT);
+
+   GO(__NR_prlimit64, "(get) 4s 1m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0, x0 + 1); FAILx(EFAULT);
+
+   GO(__NR_prlimit64, "(get+set) 4s 2m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0 + 1, x0 + 1); FAILx(EFAULT);
+
     // no such syscall...
    GO(9999, "1e");
    SY(9999); FAIL;
index 12f6fcba374c8f9848da13e9243da90b2bf4e10b..1757cc3eb42ea2911352ab7a4e6930833d9e5851 100644 (file)
@@ -45,6 +45,38 @@ Syscall param write(buf) points to unaddressable byte(s)
 -----------------------------------------------------
  60:           __NR_exit below
 -----------------------------------------------------
+-----------------------------------------------------
+ 97:      __NR_getrlimit 2s 1m
+-----------------------------------------------------
+Syscall param getrlimit(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param getrlimit(rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param getrlimit(rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+-----------------------------------------------------
+160:      __NR_setrlimit 2s 1m
+-----------------------------------------------------
+Syscall param setrlimit(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param setrlimit(rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param setrlimit(rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 -----------------------------------------------------
 247:         __NR_waitid 5s 0m
 -----------------------------------------------------
@@ -101,6 +133,102 @@ Syscall param waitid(ru) points to unaddressable byte(s)
    by 0x........: main (scalar.c)
  Address 0x........ is not stack'd, malloc'd or (recently) free'd
 
+-----------------------------------------------------
+302:      __NR_prlimit64 (nop) 4s 0m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+-----------------------------------------------------
+302:      __NR_prlimit64 (set) 4s 1m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(new_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+-----------------------------------------------------
+302:      __NR_prlimit64 (get) 4s 1m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(old_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+-----------------------------------------------------
+302:      __NR_prlimit64 (get+set) 4s 2m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(new_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param rlimit64(old_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 -----------------------------------------------------
 9999:                9999 1e
 -----------------------------------------------------
index 5141f0496c087d26dce386f5c68d634428289198..e6ff44fe0e9f1cb671700293bd634a9fe7dbdac8 100644 (file)
@@ -7,6 +7,7 @@
 #include <signal.h>
 #include <sys/mman.h> // MREMAP_FIXED
 #include <sys/prctl.h>
+#include <sys/resource.h>
 
 // Here we are trying to trigger every syscall error (scalar errors and
 // memory errors) for every syscall.  We do this by passing a lot of bogus
@@ -1283,6 +1284,19 @@ int main(void)
    GO(__NR_epoll_create1, "1s 0m");
    SY(__NR_epoll_create1, x0); SUCC_OR_FAIL;
 
+   // __NR_prlimit64 340
+   GO(__NR_prlimit64, "(nop) 4s 0m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0, x0); SUCC;
+
+   GO(__NR_prlimit64, "(set) 4s 1m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0 + 1, x0); FAILx(EFAULT);
+
+   GO(__NR_prlimit64, "(get) 4s 1m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0, x0 + 1); FAILx(EFAULT);
+
+   GO(__NR_prlimit64, "(get+set) 4s 2m");
+   SY(__NR_prlimit64, x0, x0 + RLIMIT_NOFILE, x0 + 1, x0 + 1); FAILx(EFAULT);
+
    // __NR_process_vm_readv 347
    GO(__NR_process_vm_readv, "6s 2m");
    SY(__NR_process_vm_readv, x0, x0, x0+1, x0, x0+1, x0); FAIL;
index b75507547026cd1580fa1b4e4fdd977030bed0d4..3cbb0c6ff5193f5497e5458fb4323b64e8874f8c 100644 (file)
@@ -4208,6 +4208,102 @@ Syscall param epoll_create1(flags) contains uninitialised byte(s)
    ...
    by 0x........: main (scalar.c)
 
+-----------------------------------------------------
+340:      __NR_prlimit64 (nop) 4s 0m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+-----------------------------------------------------
+340:      __NR_prlimit64 (set) 4s 1m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(new_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+-----------------------------------------------------
+340:      __NR_prlimit64 (get) 4s 1m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(old_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+-----------------------------------------------------
+340:      __NR_prlimit64 (get+set) 4s 2m
+-----------------------------------------------------
+Syscall param prlimit64(pid) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(resource) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(new_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param prlimit64(old_rlim) contains uninitialised byte(s)
+   ...
+   by 0x........: main (scalar.c)
+
+Syscall param rlimit64(new_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param rlimit64(old_rlim) points to unaddressable byte(s)
+   ...
+   by 0x........: main (scalar.c)
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
 -----------------------------------------------------
 347:__NR_process_vm_readv 6s 2m
 -----------------------------------------------------