https://git.reactos.org/?p=reactos.git;a=commitdiff;h=555f98267c516fd21f2da98f022f6a1590aec022

commit 555f98267c516fd21f2da98f022f6a1590aec022
Author:     Jérôme Gardou <jerome.gar...@reactos.org>
AuthorDate: Fri Sep 11 15:40:24 2020 +0200
Commit:     Jérôme Gardou <jerome.gar...@reactos.org>
CommitDate: Wed Sep 16 10:35:36 2020 +0200

    Revert "[DBGHELP] SymFromAddr: Handle 2 or more symbols at the same address 
correct."
    
    This reverts commit 0263151f3c49446f76af53f9648109de3653c0b9.
    
    It will be applied later through winesync script
---
 dll/win32/dbghelp/symbol.c | 58 ++++++++++++++--------------------------------
 1 file changed, 18 insertions(+), 40 deletions(-)

diff --git a/dll/win32/dbghelp/symbol.c b/dll/win32/dbghelp/symbol.c
index 15a0a9c378b..38d2a5b7291 100644
--- a/dll/win32/dbghelp/symbol.c
+++ b/dll/win32/dbghelp/symbol.c
@@ -874,33 +874,6 @@ static void symt_get_length(struct module* module, const 
struct symt* symt, ULON
     *size = 0x1000; /* arbitrary value */
 }
 
-/* neede by symt_find_nearest */
-int symt_get_best_at(struct module* module, int idx_sorttab)
-{
-    ULONG64 ref_addr;
-    int idx_sorttab_orig = idx_sorttab;
-    if (module->addr_sorttab[idx_sorttab]->symt.tag == SymTagPublicSymbol)
-    {
-        symt_get_address(&module->addr_sorttab[idx_sorttab]->symt, &ref_addr);
-        while (idx_sorttab > 0 &&
-               module->addr_sorttab[idx_sorttab]->symt.tag == 
SymTagPublicSymbol &&
-               !cmp_sorttab_addr(module, idx_sorttab - 1, ref_addr))
-            idx_sorttab--;
-        if (module->addr_sorttab[idx_sorttab]->symt.tag == SymTagPublicSymbol)
-        {
-            idx_sorttab = idx_sorttab_orig;
-            while (idx_sorttab < module->num_sorttab - 1 &&
-                   module->addr_sorttab[idx_sorttab]->symt.tag == 
SymTagPublicSymbol &&
-                   !cmp_sorttab_addr(module, idx_sorttab + 1, ref_addr))
-                idx_sorttab++;
-        }
-        /* if no better symbol fond restore original */
-        if (module->addr_sorttab[idx_sorttab]->symt.tag == SymTagPublicSymbol)
-            idx_sorttab = idx_sorttab_orig;
-    }
-    return idx_sorttab;
-}
-
 /* assume addr is in module */
 struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr)
 {
@@ -919,12 +892,7 @@ struct symt_ht* symt_find_nearest(struct module* module, 
DWORD_PTR addr)
     high = module->num_sorttab;
 
     symt_get_address(&module->addr_sorttab[0]->symt, &ref_addr);
-    if (addr <= ref_addr)
-    {
-        low = symt_get_best_at(module, 0);
-        return module->addr_sorttab[low];
-    }
-
+    if (addr < ref_addr) return NULL;
     if (high)
     {
         symt_get_address(&module->addr_sorttab[high - 1]->symt, &ref_addr);
@@ -947,13 +915,23 @@ struct symt_ht* symt_find_nearest(struct module* module, 
DWORD_PTR addr)
     /* If found symbol is a public symbol, check if there are any other 
entries that
      * might also have the same address, but would get better information
      */
-    low = symt_get_best_at(module, low);
-
+    if (module->addr_sorttab[low]->symt.tag == SymTagPublicSymbol)
+    {
+        symt_get_address(&module->addr_sorttab[low]->symt, &ref_addr);
+        if (low > 0 &&
+            module->addr_sorttab[low - 1]->symt.tag != SymTagPublicSymbol &&
+            !cmp_sorttab_addr(module, low - 1, ref_addr))
+            low--;
+        else if (low < module->num_sorttab - 1 &&
+                 module->addr_sorttab[low + 1]->symt.tag != SymTagPublicSymbol 
&&
+                 !cmp_sorttab_addr(module, low + 1, ref_addr))
+            low++;
+    }
     /* finally check that we fit into the found symbol */
-    //symt_get_address(&module->addr_sorttab[low]->symt, &ref_addr);
-    //if (addr < ref_addr) return NULL;
-    //symt_get_length(module, &module->addr_sorttab[low]->symt, &ref_size);
-    //if (addr >= ref_addr + ref_size) return NULL;
+    symt_get_address(&module->addr_sorttab[low]->symt, &ref_addr);
+    if (addr < ref_addr) return NULL;
+    symt_get_length(module, &module->addr_sorttab[low]->symt, &ref_size);
+    if (addr >= ref_addr + ref_size) return NULL;
 
     return module->addr_sorttab[low];
 }
@@ -1282,7 +1260,7 @@ BOOL WINAPI SymFromAddr(HANDLE hProcess, DWORD64 Address,
 
     symt_fill_sym_info(&pair, NULL, &sym->symt, Symbol);
     if (Displacement)
-        *Displacement = (Address >= Symbol->Address) ? (Address - 
Symbol->Address) : (DWORD64)-1;
+        *Displacement = Address - Symbol->Address;
     return TRUE;
 }
 

Reply via email to