Vitaliy Margolen : dbghelp: Fix detection of ELF libs by their name.

Alexandre Julliard julliard at winehq.org
Mon Oct 29 08:34:56 CDT 2007


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

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Sun Oct 28 15:26:29 2007 -0600

dbghelp: Fix detection of ELF libs by their name.

---

 dlls/dbghelp/module.c |   37 +++++++++++++++++++++++--------------
 1 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 59daa0d..f3c5e15 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -402,23 +402,32 @@ static BOOL module_is_elf_container_loaded(const struct process* pcs,
  */
 enum module_type module_get_type_by_name(const WCHAR* name)
 {
-    const WCHAR*ptr;
-    int         len = strlenW(name);
+    int len = strlenW(name);
 
-    /* check for terminating .so or .so.[digit] */
-    ptr = strrchrW(name, '.');
-    if (ptr)
+    /* Skip all version extensions (.[digits]) regex: "(\.\d+)*$" */
+    do
     {
-        if (!strcmpW(ptr, S_DotSoW) ||
-            (isdigit(ptr[1]) && !ptr[2] && ptr >= name + 3 && !memcmp(ptr - 3, S_DotSoW, 3)))
-            return DMT_ELF;
-        else if (!strcmpiW(ptr, S_DotPdbW))
-            return DMT_PDB;
-    }
+        int i = len;
+
+        while (i && isdigit(name[i - 1])) i--;
+
+        if (i && name[i - 1] == '.')
+            len = i - 1;
+        else
+            break;
+    } while (len);
+
+    /* check for terminating .so or .so.[digit] */
+    if (len > 3 && !memcmp(name + len - 3, S_DotSoW, 3))
+        return DMT_ELF;
+
+    if (len > 4 && !strncmpiW(name + len - 4, S_DotPdbW, 4))
+        return DMT_PDB;
+
     /* wine-[kp]thread is also an ELF module */
-    else if (((len > 12 && name[len - 13] == '/') || len == 12) &&
-             (!strcmpiW(name + len - 12, S_WinePThreadW) ||
-              !strcmpiW(name + len - 12, S_WineKThreadW)))
+    if (((len > 12 && name[len - 13] == '/') || len == 12) &&
+        (!strncmpiW(name + len - 12, S_WinePThreadW, 12) ||
+         !strncmpiW(name + len - 12, S_WineKThreadW, 12)))
     {
         return DMT_ELF;
     }




More information about the wine-cvs mailing list