From: Tom Hughes Date: Sat, 7 May 2005 17:57:39 +0000 (+0000) Subject: Rework signal stack handling to avoid doing arithmetic on void pointers X-Git-Tag: svn/VALGRIND_3_0_0~690 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=37aca15f81fe7a8877bc008b5f47813645149a8b;p=thirdparty%2Fvalgrind.git Rework signal stack handling to avoid doing arithmetic on void pointers and to avoid trashing the red zone while delivering a signal on the main stack on amd64 systems. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3628 --- diff --git a/coregrind/m_sigframe/sigframe-amd64-linux.c b/coregrind/m_sigframe/sigframe-amd64-linux.c index c4a19bb888..80379c2f22 100644 --- a/coregrind/m_sigframe/sigframe-amd64-linux.c +++ b/coregrind/m_sigframe/sigframe-amd64-linux.c @@ -404,7 +404,8 @@ static Bool extend ( ThreadState *tst, Addr addr, SizeT size ) /* For tracking memory events, indicate the entire frame has been allocated. */ - VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, size ); + VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, + size + VGA_STACK_REDZONE_SIZE ); return True; } @@ -600,7 +601,8 @@ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) size = restore_rt_sigframe(tst, (struct rt_sigframe *)rsp, &sigNo); - VG_TRACK( die_mem_stack_signal, rsp - VGA_STACK_REDZONE_SIZE, size ); + VG_TRACK( die_mem_stack_signal, rsp - VGA_STACK_REDZONE_SIZE, + size + VGA_STACK_REDZONE_SIZE ); if (VG_(clo_trace_signals)) VG_(message)( diff --git a/coregrind/m_sigframe/sigframe-x86-linux.c b/coregrind/m_sigframe/sigframe-x86-linux.c index 56ba8cce1e..07e3c6dc50 100644 --- a/coregrind/m_sigframe/sigframe-x86-linux.c +++ b/coregrind/m_sigframe/sigframe-x86-linux.c @@ -425,7 +425,8 @@ static Bool extend ( ThreadState *tst, Addr addr, SizeT size ) /* For tracking memory events, indicate the entire frame has been allocated. */ - VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, size ); + VG_TRACK( new_mem_stack_signal, addr - VGA_STACK_REDZONE_SIZE, + size + VGA_STACK_REDZONE_SIZE ); return True; } @@ -682,7 +683,8 @@ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) else size = restore_rt_sigframe(tst, (struct rt_sigframe *)esp, &sigNo); - VG_TRACK( die_mem_stack_signal, esp - VGA_STACK_REDZONE_SIZE, size ); + VG_TRACK( die_mem_stack_signal, esp - VGA_STACK_REDZONE_SIZE, + size + VGA_STACK_REDZONE_SIZE ); if (VG_(clo_trace_signals)) VG_(message)( diff --git a/coregrind/vg_signals.c b/coregrind/vg_signals.c index 100a5bae96..94a9b142e1 100644 --- a/coregrind/vg_signals.c +++ b/coregrind/vg_signals.c @@ -474,10 +474,6 @@ void VG_(do_sys_sigaltstack) ( ThreadId tid ) VG_(threads)[tid].altstack.ss_sp = ss->ss_sp; VG_(threads)[tid].altstack.ss_size = ss->ss_size; VG_(threads)[tid].altstack.ss_flags = 0; - - VG_TRACK( new_mem_stack_signal, - ss->ss_sp + ss->ss_size - VGA_STACK_REDZONE_SIZE, - VGA_STACK_REDZONE_SIZE ); } } SET_SYSCALL_RETVAL(tid, 0); @@ -809,7 +805,7 @@ void push_signal_frame ( ThreadId tid, const vki_siginfo_t *siginfo ) VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/True ); } else { - esp_top_of_frame = STACK_PTR(tst->arch); + esp_top_of_frame = STACK_PTR(tst->arch) - VGA_STACK_REDZONE_SIZE; /* Signal delivery to tools */ VG_TRACK( pre_deliver_signal, tid, sigNo, /*alt_stack*/False );