From b1d6b96f07ef603a6aec5565da29c1c8c5dc261b Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Sat, 25 Apr 2015 18:23:21 +0000 Subject: [PATCH] Fix BZ #342683. Based on patch by Ivo Raisr. What this does is to make sure that the initial client data segment is marked as unaddressable. This is consistent with the behaviour of brk when the data segment is shrunk. The "freed" memory is marked as unaddressable. Special tweaks were needed for s390 which was returning early from the funtion to avoid sloppy register definedness initialisation. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15144 --- NEWS | 1 + coregrind/m_initimg/initimg-linux.c | 18 +++++++++++++++++- memcheck/tests/dw4.stderr.exp | 4 ++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 2a61168449..71e0755f69 100644 --- a/NEWS +++ b/NEWS @@ -108,6 +108,7 @@ where XXXXXX is the bug number as listed below. 342353 Allow dumping full massif output while valgrind is still running 342603 Add I2C_SMBUS ioctl support 342635 OS X 10.10 (Yosemite) - missing system calls and fcntl code +342683 Mark memory past the initial brk limit as unaddressable 342795 Internal glibc __GI_mempcpy call should be intercepted 343012 Unhandled syscall 319 (memfd_create) 343069 Patch updating v4l2 API support diff --git a/coregrind/m_initimg/initimg-linux.c b/coregrind/m_initimg/initimg-linux.c index 868325bd2d..64b404fe7d 100644 --- a/coregrind/m_initimg/initimg-linux.c +++ b/coregrind/m_initimg/initimg-linux.c @@ -1143,7 +1143,12 @@ void VG_(ii_finalise_image)( IIFinaliseImageInfo iifii ) VG_TRACK(post_reg_write, Vg_CoreStartup, /*tid*/1, VG_O_STACK_PTR, 8); VG_TRACK(post_reg_write, Vg_CoreStartup, /*tid*/1, VG_O_FPC_REG, 4); VG_TRACK(post_reg_write, Vg_CoreStartup, /*tid*/1, VG_O_INSTR_PTR, 8); - return; + + /* At the end of this function there is code to mark all guest state + registers as defined. For s390 that would be wrong, because the ABI + says that all registers except SP, IA, and FPC are undefined upon + process startup. */ +#define PRECISE_GUEST_REG_DEFINEDNESS_AT_STARTUP 1 # elif defined(VGP_mips32_linux) vg_assert(0 == sizeof(VexGuestMIPS32State) % 16); @@ -1192,9 +1197,20 @@ void VG_(ii_finalise_image)( IIFinaliseImageInfo iifii ) # error Unknown platform # endif +# if !defined(PRECISE_GUEST_REG_DEFINEDNESS_AT_STARTUP) /* Tell the tool that we just wrote to the registers. */ VG_TRACK( post_reg_write, Vg_CoreStartup, /*tid*/1, /*offset*/0, sizeof(VexGuestArchState)); +# endif + + /* Tell the tool about the client data segment and then kill it which will + make it inaccessible/unaddressable. */ + const NSegment *seg = VG_(am_find_nsegment)(VG_(brk_base)); + vg_assert(seg); + vg_assert(seg->kind == SkAnonC); + VG_TRACK(new_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base), + 1/*tid*/); + VG_TRACK(die_mem_brk, VG_(brk_base), seg->end + 1 - VG_(brk_base)); } #endif // defined(VGO_linux) diff --git a/memcheck/tests/dw4.stderr.exp b/memcheck/tests/dw4.stderr.exp index e396a43b8a..917dcb57e3 100644 --- a/memcheck/tests/dw4.stderr.exp +++ b/memcheck/tests/dw4.stderr.exp @@ -27,8 +27,8 @@ Uninitialised byte(s) found during client check request by 0x........: main (dw4.c:82) Address 0x........ is in a rw- mapped file valgrind-dw4-test.PID segment -Uninitialised byte(s) found during client check request - at 0x........: croak (dw4.c:32) +Unaddressable byte(s) found during client check request + at 0x........: croak (dw4.c:25) by 0x........: main (dw4.c:87) Address 0x........ is 0 bytes after the brk data segment limit 0x........ -- 2.47.3