From c1a2a2f1799bd0e431fee10af7e1e30a0124b418 Mon Sep 17 00:00:00 2001 From: Jason Green Date: Wed, 21 Nov 2007 09:59:13 -0500 Subject: [PATCH] Prevent huge minidumps by ensuring the memory range is clamped. --- dlls/dbghelp/minidump.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 files changed, 36 insertions(+), 6 deletions(-) diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c index 964ce10..44a88f1 100644 --- a/dlls/dbghelp/minidump.c +++ b/dlls/dbghelp/minidump.c @@ -119,20 +119,50 @@ static void fetch_thread_stack(struct dump_context* dc, const void* teb_addr, { #ifdef __i386__ /* limiting the stack dumping to the size actually used */ - if (ctx->Esp) - mmd->StartOfMemoryRange = (ctx->Esp - 4); + if (ctx->Esp){ + + /* make sure ESP is within the established range of the stack. It could have + been clobbered by whatever caused the original exception. */ + if (ctx->Esp - 4 < (ULONG_PTR)tib.StackLimit || ctx->Esp - 4 > (ULONG_PTR)tib.StackBase) + mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + + else + mmd->StartOfMemoryRange = (ctx->Esp - 4); + } + else mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + #elif defined(__powerpc__) - if (ctx->Iar) - mmd->StartOfMemoryRange = ctx->Iar - 4; + if (ctx->Iar){ + + /* make sure IAR is within the established range of the stack. It could have + been clobbered by whatever caused the original exception. */ + if (ctx->Iar - 4 < (ULONG_PTR)tib.StackLimit || ctx->Iar - 4 > (ULONG_PTR)tib.StackBase) + mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + + else + mmd->StartOfMemoryRange = (ctx->Iar - 4); + } + else mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + #elif defined(__x86_64__) - if (ctx->Rsp) - mmd->StartOfMemoryRange = (ctx->Rsp - 8); + if (ctx->Rsp){ + + /* make sure RSP is within the established range of the stack. It could have + been clobbered by whatever caused the original exception. */ + if (ctx->Rsp - 8 < (ULONG_PTR)tib.StackLimit || ctx->Rsp - 8 > (ULONG_PTR)tib.StackBase) + mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + + else + mmd->StartOfMemoryRange = (ctx->Rsp - 8); + } + else mmd->StartOfMemoryRange = (ULONG_PTR)tib.StackLimit; + #else #error unsupported CPU #endif -- 1.4.4.2