Workaround with infinite loop while walking along the stack frames on wine64.
authorRalf Habacker <ralf.habacker@freenet.de>
Tue, 17 Nov 2015 15:42:40 +0000 (16:42 +0100)
committerRalf Habacker <ralf.habacker@freenet.de>
Tue, 24 Nov 2015 12:46:50 +0000 (13:46 +0100)
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=92721
Reviewed-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
dbus/dbus-sysdeps-win.c

index 83ab5f9..1a35a89 100644 (file)
@@ -2423,6 +2423,7 @@ _dbus_delete_file (const DBusString *filename,
 
 static void dump_backtrace_for_thread (HANDLE hThread)
 {
+  ADDRESS old_address;
   STACKFRAME sf;
   CONTEXT context;
   DWORD dwImageType;
@@ -2439,6 +2440,7 @@ static void dump_backtrace_for_thread (HANDLE hThread)
 
   DPRINTF ("Backtrace:\n");
 
+  _DBUS_ZERO (old_address);
   _DBUS_ZERO (context);
   context.ContextFlags = CONTEXT_FULL;
 
@@ -2498,6 +2500,18 @@ static void dump_backtrace_for_thread (HANDLE hThread)
       DWORD dwDisplacement;
       IMAGEHLP_MODULE moduleInfo;
 
+      /*
+         on Wine64 version 1.7.54, we get an infinite number of stack entries
+         pointing to the same stack frame  (_start+0x29 in <wine-loader>)
+         see bug https://bugs.winehq.org/show_bug.cgi?id=39606
+      */
+#ifndef __i386__
+      if (old_address.Offset == sf.AddrPC.Offset)
+        {
+          break;
+        }
+#endif
+
       pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
       pSymbol->MaxNameLen = MAX_SYM_NAME;
 
@@ -2523,6 +2537,7 @@ static void dump_backtrace_for_thread (HANDLE hThread)
           DPRINTF (" in %s", moduleInfo.ModuleName);
         }
       DPRINTF ("\n");
+      old_address = sf.AddrPC;
     }
   ResumeThread (hThread);
 }