[PATCH 7/8] dbghelp: simplify code for searching alternate debug info files

Eric Pouech eric.pouech at gmail.com
Mon Nov 22 08:21:07 CST 2021


Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/dbghelp/module.c |   73 +++++++++++++++++++++----------------------------
 1 file changed, 32 insertions(+), 41 deletions(-)

diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 73243d80da5..5614c575cd0 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -634,6 +634,17 @@ found:
     return TRUE;
 }
 
+static WCHAR* append_hex(WCHAR* dst, const BYTE* id, const BYTE* end)
+{
+    while (id < end)
+    {
+        *dst++ = "0123456789abcdef"[*id >> 4  ];
+        *dst++ = "0123456789abcdef"[*id & 0x0F];
+        id++;
+    }
+    return dst;
+}
+
 /******************************************************************
  *		image_load_debugaltlink
  *
@@ -683,16 +694,14 @@ struct image_file_map* image_load_debugaltlink(struct image_file_map* fmap, stru
                 if (dst)
                 {
                     MultiByteToWideChar(CP_UNIXCP, 0, data, -1, dst, filename_len);
-                    ret = image_check_debug_link_gnu_id(dst, fmap_link, id, data + sect_len - (const char*)id);
+                    ret = image_check_debug_link_gnu_id(dst, fmap_link, id, idlen);
                     HeapFree(GetProcessHeap(), 0, dst);
                 }
                 /* Trying relative path to build-id directory */
                 if (!ret)
                 {
-                    static const WCHAR globalDebugDirW[] =
-                        {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/','.','b','u','i','l','d','-','i','d','/'};
                     dst = HeapAlloc(GetProcessHeap(), 0,
-                                    sizeof(globalDebugDirW) + (3 + filename_len + idlen * 2) * sizeof(WCHAR));
+                                    sizeof(L"/usr/lib/debug/.build-id/") + (3 + filename_len + idlen * 2) * sizeof(WCHAR));
                     if (dst)
                     {
                         WCHAR* p;
@@ -702,21 +711,16 @@ struct image_file_map* image_load_debugaltlink(struct image_file_map* fmap, stru
                          * where the alternate file is...
                          * so try both
                          */
-                        p = memcpy(dst, globalDebugDirW, sizeof(globalDebugDirW));
-                        p += ARRAY_SIZE(globalDebugDirW);
+                        p = memcpy(dst, L"/usr/lib/debug/.build-id/", sizeof(L"/usr/lib/debug/.build-id/"));
+                        p += wcslen(dst);
                         MultiByteToWideChar(CP_UNIXCP, 0, data, -1, p, filename_len);
-                        ret = image_check_debug_link_gnu_id(dst, fmap_link, id, data + sect_len - (const char*)id);
+                        ret = image_check_debug_link_gnu_id(dst, fmap_link, id, idlen);
                         if (!ret)
                         {
-                            p = dst + ARRAY_SIZE(globalDebugDirW);
-                            if ((const char*)id < data + sect_len)
-                            {
-                                *p++ = "0123456789abcdef"[*id >> 4  ];
-                                *p++ = "0123456789abcdef"[*id & 0x0F];
-                            }
+                            p = append_hex(p, id, id + idlen);
                             *p++ = '/';
                             MultiByteToWideChar(CP_UNIXCP, 0, data, -1, p, filename_len);
-                            ret = image_check_debug_link_gnu_id(dst, fmap_link, id, data + sect_len - (const char*)id);
+                            ret = image_check_debug_link_gnu_id(dst, fmap_link, id, idlen);
                         }
                         HeapFree(GetProcessHeap(), 0, dst);
                     }
@@ -742,51 +746,38 @@ struct image_file_map* image_load_debugaltlink(struct image_file_map* fmap, stru
  */
 static BOOL image_locate_build_id_target(struct image_file_map* fmap, const BYTE* id, unsigned idlen)
 {
-    static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'};
-    static const WCHAR buildidW[] = {'.','b','u','i','l','d','-','i','d','/'};
     struct image_file_map* fmap_link = NULL;
     WCHAR* p;
     WCHAR* z;
-    const BYTE* idend = id + idlen;
 
     fmap_link = HeapAlloc(GetProcessHeap(), 0, sizeof(*fmap_link));
     if (!fmap_link) return FALSE;
 
-    p = HeapAlloc(GetProcessHeap(), 0,
-                  sizeof(globalDebugDirW) + sizeof(buildidW) +
-                  (idlen * 2 + 1) * sizeof(WCHAR) + sizeof(L".debug"));
-    z = p;
-    memcpy(z, globalDebugDirW, sizeof(globalDebugDirW));
-    z += ARRAY_SIZE(globalDebugDirW);
-    memcpy(z, buildidW, sizeof(buildidW));
-    z += ARRAY_SIZE(buildidW);
-
-    if (id < idend)
+    p = malloc(sizeof(L"/usr/lib/debug/.build-id/") +
+               (idlen * 2 + 1) * sizeof(WCHAR) + sizeof(L".debug"));
+    wcscpy(p, L"/usr/lib/debug/.build-id/");
+    z = p + wcslen(p);
+    if (idlen)
     {
-        *z++ = "0123456789abcdef"[*id >> 4  ];
-        *z++ = "0123456789abcdef"[*id & 0x0F];
-        id++;
-    }
-    if (id < idend)
-        *z++ = '/';
-    while (id < idend)
-    {
-        *z++ = "0123456789abcdef"[*id >> 4  ];
-        *z++ = "0123456789abcdef"[*id & 0x0F];
-        id++;
+        z = append_hex(z, id, id + 1);
+        if (idlen > 1)
+        {
+            *z++ = L'/';
+            z = append_hex(z, id + 1, id + idlen);
+        }
     }
     memcpy(z, L".debug", sizeof(L".debug"));
     TRACE("checking %s\n", wine_dbgstr_w(p));
 
-    if (image_check_debug_link_gnu_id(p, fmap_link, idend - idlen, idlen))
+    if (image_check_debug_link_gnu_id(p, fmap_link, id, idlen))
     {
-        HeapFree(GetProcessHeap(), 0, p);
+        free(p);
         fmap->alternate = fmap_link;
         return TRUE;
     }
 
     TRACE("not found\n");
-    HeapFree(GetProcessHeap(), 0, p);
+    free(p);
     HeapFree(GetProcessHeap(), 0, fmap_link);
     return FALSE;
 }




More information about the wine-devel mailing list