]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Rework signal stack handling to avoid doing arithmetic on void pointers
authorTom Hughes <tom@compton.nu>
Sat, 7 May 2005 17:57:39 +0000 (17:57 +0000)
committerTom Hughes <tom@compton.nu>
Sat, 7 May 2005 17:57:39 +0000 (17:57 +0000)
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

coregrind/m_sigframe/sigframe-amd64-linux.c
coregrind/m_sigframe/sigframe-x86-linux.c
coregrind/vg_signals.c

index c4a19bb888cb4a1ae3cf64cf7548f3b37d3d09e3..80379c2f22cfd3d82d22cf1bfb4b91123b239e7f 100644 (file)
@@ -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)(
index 56ba8cce1e88e0774c843fbc01ffbe433a0355d9..07e3c6dc5088fa413d7c601b64f71ef6ae9c1b85 100644 (file)
@@ -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)(
index 100a5bae96b1c8ccc07d27f95b5b088298b1146a..94a9b142e1d7ca866c589471e3f147fc83b79900 100644 (file)
@@ -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 );