From: Matthias Schwarzott Date: Sat, 23 Aug 2025 11:37:46 +0000 (+0200) Subject: Bug 508778 - syscall-wrapper waitid warns about infop=null X-Git-Tag: VALGRIND_3_26_0~183 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=405fb0daaf329068a5219ef4c0e645cea872cf75;p=thirdparty%2Fvalgrind.git Bug 508778 - syscall-wrapper waitid warns about infop=null This is used by e.g. Qt: https://github.com/qt/qtbase/blob/e17798560b107b7abd5f2cf472d942e8ac4213ff/src/3rdparty/forkfd/forkfd_linux.c#L128 --- diff --git a/NEWS b/NEWS index b3bce5400..0d6e10ee9 100644 --- a/NEWS +++ b/NEWS @@ -88,6 +88,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 508154 PRE(sys_fchownat) not handling VKI_AT_FDCWD 508638 Self-hosting not working on FreeBSD 508777 amd64-linux: add minimal scalar test +508778 syscall-wrapper waitid warns about infop=null 508869 x86-linux: simplify scalar test output To see details of a given bug, visit diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index f5723f8cd..a740912f8 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -4087,13 +4087,15 @@ PRE(sys_waitid) PRE_REG_READ5(int32_t, "sys_waitid", int, which, vki_pid_t, pid, struct vki_siginfo *, infop, int, options, struct vki_rusage *, ru); - PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) ); + if (ARG3 != 0) + PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) ); if (ARG5 != 0) PRE_MEM_WRITE( "waitid(ru)", ARG5, sizeof(struct vki_rusage) ); } POST(sys_waitid) { - POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) ); + if (ARG3 != 0) + POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) ); if (ARG5 != 0) POST_MEM_WRITE( ARG5, sizeof(struct vki_rusage) ); } diff --git a/memcheck/tests/amd64-linux/scalar.c b/memcheck/tests/amd64-linux/scalar.c index 703d46860..5167fde2d 100644 --- a/memcheck/tests/amd64-linux/scalar.c +++ b/memcheck/tests/amd64-linux/scalar.c @@ -45,6 +45,13 @@ int main(void) GO(__NR_exit, "below"); // (see below) + // __NR_waitid 247 + GO(__NR_waitid, "5s 0m"); + SY(__NR_waitid, x0, x0, x0, x0, x0); FAIL; + + GO(__NR_waitid, "(infop,ru) 5s 2m"); + SY(__NR_waitid, x0, x0, x0 + 1, x0, x0 + 1); FAIL; + // no such syscall... GO(9999, "1e"); SY(9999); FAIL; diff --git a/memcheck/tests/amd64-linux/scalar.stderr.exp b/memcheck/tests/amd64-linux/scalar.stderr.exp index 8f7c3073c..12f6fcba3 100644 --- a/memcheck/tests/amd64-linux/scalar.stderr.exp +++ b/memcheck/tests/amd64-linux/scalar.stderr.exp @@ -45,6 +45,62 @@ Syscall param write(buf) points to unaddressable byte(s) ----------------------------------------------------- 60: __NR_exit below ----------------------------------------------------- +----------------------------------------------------- +247: __NR_waitid 5s 0m +----------------------------------------------------- +Syscall param sys_waitid(which) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(pid) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(infop) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(options) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(ru) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +----------------------------------------------------- +247: __NR_waitid (infop,ru) 5s 2m +----------------------------------------------------- +Syscall param sys_waitid(which) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(pid) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(infop) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(options) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(ru) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param waitid(infop) points to unaddressable byte(s) + ... + by 0x........: main (scalar.c) + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +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 + ----------------------------------------------------- 9999: 9999 1e ----------------------------------------------------- diff --git a/memcheck/tests/x86-linux/scalar.c b/memcheck/tests/x86-linux/scalar.c index fe36a47ef..5141f0496 100644 --- a/memcheck/tests/x86-linux/scalar.c +++ b/memcheck/tests/x86-linux/scalar.c @@ -1272,6 +1272,13 @@ int main(void) GO(__NR_sys_kexec_load, "ni"); SY(__NR_sys_kexec_load); FAIL; + // __NR_waitid 284 + GO(__NR_waitid, "5s 0m"); + SY(__NR_waitid, x0, x0, x0, x0, x0); FAIL; + + GO(__NR_waitid, "(infop,ru) 5s 2m"); + SY(__NR_waitid, x0, x0, x0 + 1, x0, x0 + 2); FAIL; + // __NR_epoll_create1 329 GO(__NR_epoll_create1, "1s 0m"); SY(__NR_epoll_create1, x0); SUCC_OR_FAIL; diff --git a/memcheck/tests/x86-linux/scalar.stderr.exp b/memcheck/tests/x86-linux/scalar.stderr.exp index c878e4465..b75507547 100644 --- a/memcheck/tests/x86-linux/scalar.stderr.exp +++ b/memcheck/tests/x86-linux/scalar.stderr.exp @@ -4145,6 +4145,62 @@ Syscall param mq_getsetattr(omqstat) points to unaddressable byte(s) ----------------------------------------------------- 283: __NR_sys_kexec_load ni ----------------------------------------------------- +----------------------------------------------------- +284: __NR_waitid 5s 0m +----------------------------------------------------- +Syscall param sys_waitid(which) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(pid) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(infop) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(options) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(ru) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +----------------------------------------------------- +284: __NR_waitid (infop,ru) 5s 2m +----------------------------------------------------- +Syscall param sys_waitid(which) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(pid) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(infop) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(options) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param sys_waitid(ru) contains uninitialised byte(s) + ... + by 0x........: main (scalar.c) + +Syscall param waitid(infop) points to unaddressable byte(s) + ... + by 0x........: main (scalar.c) + Address 0x........ is not stack'd, malloc'd or (recently) free'd + +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 + ----------------------------------------------------- 329: __NR_epoll_create1 1s 0m -----------------------------------------------------