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 <[email protected]>
Date: Tue, 1 Nov 2022 14:01:08 +0000
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

Reply via email to