From e38f0a220ec6d5afda77455d011f096325b45bfb Mon Sep 17 00:00:00 2001 From: Florian Krohm Date: Sun, 15 Jul 2012 01:31:45 +0000 Subject: [PATCH] Before printing a back-trace make sure that page containing the address stored in the stack pointer is mapped. Fixes a corner case. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12749 --- coregrind/m_signals.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/coregrind/m_signals.c b/coregrind/m_signals.c index 9ef6b852a5..44774beb2d 100644 --- a/coregrind/m_signals.c +++ b/coregrind/m_signals.c @@ -1638,6 +1638,26 @@ static void default_action(const vki_siginfo_t *info, ThreadId tid) obviously stupid place (not mapped readable) that would likely cause a segfault. */ if (VG_(is_valid_tid)(tid)) { + +#if defined(VGO_linux) + /* Make sure that the address stored in the stack pointer is + located in a mapped page. That is not necessarily so. E.g. + consider the scenario where the stack pointer was decreased + and now has a value that is just below the end of a page that has + not been mapped yet. In that case VG_(am_is_valid_for_client) + will consider the address of the stack pointer invalid and that + would cause a back-trace of depth 1 to be printed, instead of a + full back-trace. */ + if (tid == 1) { // main thread + Addr esp = VG_(get_SP)(tid); + Addr base = VG_PGROUNDDN(esp - VG_STACK_REDZONE_SZB); + if (VG_(extend_stack)(base, VG_(threads)[tid].client_stack_szB)) { + if (VG_(clo_trace_signals)) + VG_(dmsg)(" -> extended stack base to %#lx\n", + VG_PGROUNDDN(esp)); + } + } +#endif ExeContext* ec = VG_(am_is_valid_for_client) (VG_(get_SP)(tid), sizeof(Addr), VKI_PROT_READ) ? VG_(record_ExeContext)( tid, 0/*first_ip_delta*/ ) -- 2.47.2