Eric Pouech : dbghelp: Separate alternate debug file lookup functions.

Alexandre Julliard julliard at winehq.org
Thu Sep 16 15:34:31 CDT 2021


Module: wine
Branch: master
Commit: fc380e06914683a0d64d8c62c10c22433fc37b4a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fc380e06914683a0d64d8c62c10c22433fc37b4a

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Thu Sep 16 11:09:45 2021 +0200

dbghelp: Separate alternate debug file lookup functions.

Split in two different (and disjoint) the functions for checking that
an alternate debug file matches the expected one
- the first based on crc
- the second based on GNU build-id

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/module.c | 99 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 59 insertions(+), 40 deletions(-)

diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index cda12f4c350..c71e016b824 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -467,12 +467,13 @@ static BOOL module_is_container_loaded(const struct process* pcs,
     return FALSE;
 }
 
-static BOOL image_check_debug_link(const WCHAR* file, struct image_file_map* fmap, DWORD link_crc)
+static BOOL image_check_debug_link_crc(const WCHAR* file, struct image_file_map* fmap, DWORD link_crc)
 {
     DWORD read_bytes;
     HANDLE handle;
     WCHAR *path;
     WORD magic;
+    DWORD crc;
     BOOL ret;
 
     path = get_dos_file_name(file);
@@ -480,15 +481,12 @@ static BOOL image_check_debug_link(const WCHAR* file, struct image_file_map* fma
     heap_free(path);
     if (handle == INVALID_HANDLE_VALUE) return FALSE;
 
-    if (link_crc)
+    crc = calc_crc32(handle);
+    if (crc != link_crc)
     {
-        DWORD crc = calc_crc32(handle);
-        if (crc != link_crc)
-        {
-            WARN("Bad CRC for file %s (got %08x while expecting %08x)\n",  debugstr_w(file), crc, link_crc);
-            CloseHandle(handle);
-            return FALSE;
-        }
+        WARN("Bad CRC for file %s (got %08x while expecting %08x)\n",  debugstr_w(file), crc, link_crc);
+        CloseHandle(handle);
+        return FALSE;
     }
 
     SetFilePointer(handle, 0, 0, FILE_BEGIN);
@@ -500,6 +498,49 @@ static BOOL image_check_debug_link(const WCHAR* file, struct image_file_map* fma
     return ret;
 }
 
+static BOOL image_check_debug_link_gnu_id(const WCHAR* file, struct image_file_map* fmap, const BYTE* id, unsigned idlen)
+{
+    struct image_section_map buildid_sect;
+    DWORD read_bytes;
+    HANDLE handle;
+    WCHAR *path;
+    WORD magic;
+    BOOL ret;
+
+    path = get_dos_file_name(file);
+    handle = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
+    heap_free(path);
+    if (handle == INVALID_HANDLE_VALUE) return FALSE;
+
+    TRACE("Located debug information file at %s\n", debugstr_w(file));
+
+    if (ReadFile(handle, &magic, sizeof(magic), &read_bytes, NULL) && magic == IMAGE_DOS_SIGNATURE)
+        ret = pe_map_file(handle, fmap, DMT_PE);
+    else
+        ret = elf_map_handle(handle, fmap);
+    CloseHandle(handle);
+
+    if (ret && image_find_section(fmap, ".note.gnu.build-id", &buildid_sect))
+    {
+        const UINT32* note;
+
+        note = (const UINT32*)image_map_section(&buildid_sect);
+        if (note != IMAGE_NO_MAP)
+        {
+            /* the usual ELF note structure: name-size desc-size type <name> <desc> */
+            if (note[2] == NOTE_GNU_BUILD_ID)
+            {
+                if (note[1] == idlen && !memcmp(note + 3 + ((note[0] + 3) >> 2), id, idlen))
+                    return TRUE;
+                WARN("mismatch in buildid information for %s\n", wine_dbgstr_w(file));
+            }
+        }
+        image_unmap_section(&buildid_sect);
+        image_unmap_file(fmap);
+    }
+    return FALSE;
+}
+
 /******************************************************************
  *		image_locate_debug_link
  *
@@ -548,12 +589,12 @@ static BOOL image_locate_debug_link(const struct module* module, struct image_fi
 
     /* testing execdir/filename */
     MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
-    if (image_check_debug_link(p, fmap_link, crc)) goto found;
+    if (image_check_debug_link_crc(p, fmap_link, crc)) goto found;
 
     /* testing execdir/.debug/filename */
     memcpy(slash, dotDebugW, sizeof(dotDebugW));
     MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash + ARRAY_SIZE(dotDebugW), filename_len);
-    if (image_check_debug_link(p, fmap_link, crc)) goto found;
+    if (image_check_debug_link_crc(p, fmap_link, crc)) goto found;
 
     if (module->real_path)
     {
@@ -562,7 +603,7 @@ static BOOL image_locate_debug_link(const struct module* module, struct image_fi
         if ((slash2 = wcsrchr(slash, '/'))) slash = slash2 + 1;
         if ((slash2 = wcsrchr(slash, '\\'))) slash = slash2 + 1;
         MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
-        if (image_check_debug_link(p, fmap_link, crc)) goto found;
+        if (image_check_debug_link_crc(p, fmap_link, crc)) goto found;
     }
 
     /* testing globaldebugdir/execdir/filename */
@@ -570,10 +611,10 @@ static BOOL image_locate_debug_link(const struct module* module, struct image_fi
     memcpy(p, globalDebugDirW, globalDebugDirLen * sizeof(WCHAR));
     slash += globalDebugDirLen;
     MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, slash, filename_len);
-    if (image_check_debug_link(p, fmap_link, crc)) goto found;
+    if (image_check_debug_link_crc(p, fmap_link, crc)) goto found;
 
     /* finally testing filename */
-    if (image_check_debug_link(slash, fmap_link, crc)) goto found;
+    if (image_check_debug_link_crc(slash, fmap_link, crc)) goto found;
 
 
     WARN("Couldn't locate or map %s\n", filename);
@@ -632,33 +673,11 @@ static BOOL image_locate_build_id_target(struct image_file_map* fmap, const BYTE
     memcpy(z, dotDebug0W, sizeof(dotDebug0W));
     TRACE("checking %s\n", wine_dbgstr_w(p));
 
-    if (image_check_debug_link(p, fmap_link, 0))
+    if (image_check_debug_link_gnu_id(p, fmap_link, idend - idlen, idlen))
     {
-        struct image_section_map buildid_sect;
-        if (image_find_section(fmap_link, ".note.gnu.build-id", &buildid_sect))
-        {
-            const UINT32* note;
-
-            note = (const UINT32*)image_map_section(&buildid_sect);
-            if (note != IMAGE_NO_MAP)
-            {
-                /* the usual ELF note structure: name-size desc-size type <name> <desc> */
-                if (note[2] == NOTE_GNU_BUILD_ID)
-                {
-                    if (note[1] == idlen &&
-                        !memcmp(note + 3 + ((note[0] + 3) >> 2), idend - idlen, idlen))
-                    {
-                        TRACE("Located debug information file at %s\n", debugstr_w(p));
-                        HeapFree(GetProcessHeap(), 0, p);
-                        fmap->alternate = fmap_link;
-                        return TRUE;
-                    }
-                    WARN("mismatch in buildid information for %s\n", wine_dbgstr_w(p));
-                }
-            }
-            image_unmap_section(&buildid_sect);
-        }
-        image_unmap_file(fmap_link);
+        HeapFree(GetProcessHeap(), 0, p);
+        fmap->alternate = fmap_link;
+        return TRUE;
     }
 
     TRACE("not found\n");




More information about the wine-cvs mailing list