From: Paul Floyd Date: Tue, 8 Oct 2024 11:19:08 +0000 (+0200) Subject: sigaltstack syscall: improve error messages X-Git-Tag: VALGRIND_3_24_0~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc20240c84b5f61e4bf590d69eb50475fa2c119c;p=thirdparty%2Fvalgrind.git sigaltstack syscall: improve error messages Previously the same message was generated for the 3 members of stack_t. Also on FreeBSD I get a Conditional jump error with this syscall but not on all platforms, so I've added a suppression. --- diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 9093b831d..5434a6836 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -5033,9 +5033,9 @@ PRE(sys_sigaltstack) const vki_stack_t *, ss, vki_stack_t *, oss); if (ARG1 != 0) { const vki_stack_t *ss = (vki_stack_t *)(Addr)ARG1; - PRE_MEM_READ( "sigaltstack(ss)", (Addr)&ss->ss_sp, sizeof(ss->ss_sp) ); - PRE_MEM_READ( "sigaltstack(ss)", (Addr)&ss->ss_flags, sizeof(ss->ss_flags) ); - PRE_MEM_READ( "sigaltstack(ss)", (Addr)&ss->ss_size, sizeof(ss->ss_size) ); + PRE_MEM_READ( "sigaltstack(ss->ss_sp)", (Addr)&ss->ss_sp, sizeof(ss->ss_sp) ); + PRE_MEM_READ( "sigaltstack(ss->ss_size)", (Addr)&ss->ss_size, sizeof(ss->ss_size) ); + PRE_MEM_READ( "sigaltstack(ss->ss_flags)", (Addr)&ss->ss_flags, sizeof(ss->ss_flags) ); } if (ARG2 != 0) { PRE_MEM_WRITE( "sigaltstack(oss)", ARG2, sizeof(vki_stack_t) ); diff --git a/memcheck/tests/freebsd/Makefile.am b/memcheck/tests/freebsd/Makefile.am index ae4b1aa53..8329a4377 100644 --- a/memcheck/tests/freebsd/Makefile.am +++ b/memcheck/tests/freebsd/Makefile.am @@ -91,6 +91,7 @@ EXTRA_DIST = \ scalar.h scalar.vgtest \ scalar.stderr.exp \ scalar.stderr.exp-x86 \ + scalar.supp \ scalar_abort2.vgtest \ scalar_13_plus.vgtest \ scalar_13_plus.stderr.exp \ diff --git a/memcheck/tests/freebsd/scalar.c b/memcheck/tests/freebsd/scalar.c index ac8edd42a..76a9f651c 100644 --- a/memcheck/tests/freebsd/scalar.c +++ b/memcheck/tests/freebsd/scalar.c @@ -257,14 +257,8 @@ int main(void) struct our_sigaltstack oss; VALGRIND_MAKE_MEM_NOACCESS(&ss, sizeof(struct our_sigaltstack)); VALGRIND_MAKE_MEM_NOACCESS(&oss, sizeof(struct our_sigaltstack)); - GO(SYS_sigaltstack, "0s 2m"); + GO(SYS_sigaltstack, "2s 4m"); SY(SYS_sigaltstack, x0+&ss, x0+&oss); FAIL; - - GO(SYS_sigaltstack, "2s 0m"); - SY(SYS_sigaltstack, x0, x0); SUCC; - - GO(SYS_sigaltstack, "2s 2m"); - SY(SYS_sigaltstack, x0+1, x0+1); FAIL; } /* SYS_ioctl 54 */ diff --git a/memcheck/tests/freebsd/scalar.stderr.exp b/memcheck/tests/freebsd/scalar.stderr.exp index f8209228e..681bb8f2a 100644 --- a/memcheck/tests/freebsd/scalar.stderr.exp +++ b/memcheck/tests/freebsd/scalar.stderr.exp @@ -440,7 +440,7 @@ Syscall param acct(filename) points to unaddressable byte(s) Address 0x........ is not stack'd, malloc'd or (recently) free'd --------------------------------------------------------- - 53: SYS_sigaltstack 0s 2m + 53: SYS_sigaltstack 2s 4m --------------------------------------------------------- Syscall param sigaltstack(ss) contains uninitialised byte(s) ... @@ -448,40 +448,22 @@ Syscall param sigaltstack(ss) contains uninitialised byte(s) Syscall param sigaltstack(oss) contains uninitialised byte(s) ... -Syscall param sigaltstack(ss) points to unaddressable byte(s) +Syscall param sigaltstack(ss->ss_sp) points to unaddressable byte(s) ... Address 0x........ is on thread 1's stack -Syscall param sigaltstack(oss) points to unaddressable byte(s) +Syscall param sigaltstack(ss->ss_size) points to unaddressable byte(s) ... Address 0x........ is on thread 1's stack ---------------------------------------------------------- - 53: SYS_sigaltstack 2s 0m ---------------------------------------------------------- -Syscall param sigaltstack(ss) contains uninitialised byte(s) - ... - - -Syscall param sigaltstack(oss) contains uninitialised byte(s) - ... - ---------------------------------------------------------- - 53: SYS_sigaltstack 2s 2m ---------------------------------------------------------- -Syscall param sigaltstack(ss) contains uninitialised byte(s) - ... - -Syscall param sigaltstack(oss) contains uninitialised byte(s) +Syscall param sigaltstack(ss->ss_flags) points to unaddressable byte(s) ... + Address 0x........ is on thread 1's stack -Syscall param sigaltstack(ss) points to unaddressable byte(s) - ... - Address 0x........ is not stack'd, malloc'd or (recently) free'd Syscall param sigaltstack(oss) points to unaddressable byte(s) ... - Address 0x........ is not stack'd, malloc'd or (recently) free'd + Address 0x........ is on thread 1's stack --------------------------------------------------------- 54: SYS_ioctl 3s 1m diff --git a/memcheck/tests/freebsd/scalar.supp b/memcheck/tests/freebsd/scalar.supp new file mode 100644 index 000000000..f6b15a33e --- /dev/null +++ b/memcheck/tests/freebsd/scalar.supp @@ -0,0 +1,11 @@ +# not sure what causes this exactly# on x86 and amd64 (but not arm64) +# there is an conditional uninit read +# there are several if statements that use the two pointers to stack +# structures that probably generate the error + +{ + internal uninitilized read + Memcheck:Cond + fun:syscall + fun:main +} diff --git a/memcheck/tests/freebsd/scalar.vgtest b/memcheck/tests/freebsd/scalar.vgtest index 170c1576e..2f433038c 100644 --- a/memcheck/tests/freebsd/scalar.vgtest +++ b/memcheck/tests/freebsd/scalar.vgtest @@ -1,5 +1,5 @@ prog: scalar -vgopts: -q --error-limit=no +vgopts: -q --error-limit=no --suppressions=scalar.supp stderr_filter: filter_scalar # Remove all frames from the stack trace except the first one. # This is important because syscall() function on x86 isn't ABI conformant