gdbserver crash when running 32bits exes on x64 Windows.
authorJoel Brobecker <brobecker@gnat.com>
Tue, 2 Feb 2010 04:24:26 +0000 (04:24 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 2 Feb 2010 04:24:26 +0000 (04:24 +0000)
        * inferiors.c (find_inferior): Add function documentation.
        (unloaded_dll): Handle the case where the unloaded dll has not
        been previously registered in the dll list.

gdb/gdbserver/ChangeLog
gdb/gdbserver/inferiors.c

index e62f630..08277da 100644 (file)
@@ -1,3 +1,10 @@
+2010-02-02  Nicolas Roche  <roche@sourceware.org>
+            Joel Brobecker  <brobecker@adacore.com>
+
+       * inferiors.c (find_inferior): Add function documentation.
+       (unloaded_dll): Handle the case where the unloaded dll has not
+       been previously registered in the dll list.
+
 2010-02-01  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * linux-arm-low.c (thumb_breakpoint_len): Delete.
index c1a1881..097326d 100644 (file)
@@ -249,6 +249,9 @@ remove_thread (struct thread_info *thread)
   free_one_thread (&thread->entry);
 }
 
+/* Find the first inferior_list_entry E in LIST for which FUNC (E, ARG)
+   returns non-zero.  If no entry is found then return NULL.  */
+
 struct inferior_list_entry *
 find_inferior (struct inferior_list *list,
               int (*func) (struct inferior_list_entry *, void *), void *arg)
@@ -366,9 +369,25 @@ unloaded_dll (const char *name, CORE_ADDR base_addr)
   key_dll.base_addr = base_addr;
 
   dll = (void *) find_inferior (&all_dlls, match_dll, &key_dll);
-  remove_inferior (&all_dlls, &dll->entry);
-  free_one_dll (&dll->entry);
-  dlls_changed = 1;
+
+  if (dll == NULL)
+    /* For some inferiors we might get unloaded_dll events without having
+       a corresponding loaded_dll.  In that case, the dll cannot be found
+       in ALL_DLL, and there is nothing further for us to do.
+
+       This has been observed when running 32bit executables on Windows64
+       (i.e. through WOW64, the interface between the 32bits and 64bits
+       worlds).  In that case, the inferior always does some strange
+       unloading of unnamed dll.  */
+    return;
+  else
+    {
+      /* DLL has been found so remove the entry and free associated
+         resources.  */
+      remove_inferior (&all_dlls, &dll->entry);
+      free_one_dll (&dll->entry);
+      dlls_changed = 1;
+    }
 }
 
 #define clear_list(LIST) \