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
This commit is contained in:
Florian Krohm 2015-04-25 18:23:21 +00:00
parent e0927ca1ea
commit b1d6b96f07
3 changed files with 20 additions and 3 deletions

1
NEWS
View File

@ -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

View File

@ -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)

View File

@ -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........