From 0718675c768e5a5d2fc96a6a4e70cd52fe148c16 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Tue, 2 Feb 2010 04:24:26 +0000 Subject: [PATCH] gdbserver crash when running 32bits exes on x64 Windows. * 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 | 7 +++++++ gdb/gdbserver/inferiors.c | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index e62f630d9f..08277daf34 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2010-02-02 Nicolas Roche + Joel Brobecker + + * 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 * linux-arm-low.c (thumb_breakpoint_len): Delete. diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index c1a188148d..097326d7ce 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -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) \ -- 2.34.1