From cb9596484d37dc4ea3027851c88a048405cd35c0 Mon Sep 17 00:00:00 2001 From: Eric van Beurden Date: Thu, 17 Jan 2008 17:31:49 -0500 Subject: [PATCH] dbghelp: Prevent huge minidumps by ensuring the memory range is clamped. --- dlls/dbghelp/minidump.c | 42 +++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c index 3dd69cf3c8a..9ae530745ce 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