On 29/10/2022 09:32, Corinna Vinschen wrote:
On Oct 28 16:05, Jon Turney wrote:
This adds an extra section to the stackdump, which lists the loaded
modules and their base address. This is perhaps useful as it makes it
immediately clear if RandomCrashInjectedDll.dll is loaded...
XXX: It seems like the 'InMemoryOrder' part of 'InMemoryOrderModuleList' is a
lie?
Probably just an alternative fact...
Yeah. I did stared a bit at the code wondering if the structure layouts
were incorrect so we were somehow traversing one of the other module
lists with a different ordering, but everything looks correct.
The attached might be a good idea, then, to ensure that module+offset is
calculated correctly.
From ea47826047e8bb175b1b0e0286d7d7b8cf15c7fe Mon Sep 17 00:00:00 2001
From: Jon Turney
Date: Tue, 1 Nov 2022 14:01:08 +
Subject: [PATCH] Cygwin: Handle out of order modules for module offsets in
stackdump
Improve address to module+offset conversion, to work correctly in the
presence of out-of-order elements in InMemoryOrderModuleList.
Fixes: d59651d4
---
winsup/cygwin/exceptions.cc | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 8cc454c90..c3433ab94 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -342,11 +342,13 @@ prettyprint_va (PVOID func_va)
{
PLDR_DATA_TABLE_ENTRY mod = CONTAINING_RECORD (x, LDR_DATA_TABLE_ENTRY,
InMemoryOrderLinks);
- if (mod->DllBase > func_va)
+ if ((func_va < mod->DllBase) ||
+ (func_va > (PVOID)((DWORD_PTR)mod->DllBase + mod->SizeOfImage)))
continue;
__small_sprintf (buf, "%S+0x%x", &mod->BaseDllName,
(DWORD_PTR)func_va - (DWORD_PTR)mod->DllBase);
+ break;
}
return buf;
--
2.38.1