From 0e50fe5ca6ed2ce780cbbfa516aec20b023433ce Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Sun, 20 Dec 2015 00:49:59 -0500 Subject: [PATCH] gdbserver crash in gdb/gdbserver/thread.c::thread_search_callback Connecting GDB to a LynxOS-178 GDBserver causes GDBserver to crash: % gdbserver :4444 simple_main Process simple_main created; pid = 19 Listening on port 4444 Remote debugging from host 205.232.38.10 Segmentation fault (core dumped) The crash happens in thread_search_callback where the function calls the_target->thread_stopped (via the thread_stopped macro) without verifying whether the callback is NULL or not. For the record, the regression was introduced by: commit a67a9faef0e32886c83611cc7a0ba61e91123063 Date: Mon Nov 30 16:05:26 2015 +0000 Subject: gdbserver:prepare_access_memory: pick another thread This patch avoids the crash by checking the value of the callback first, before calling it. gdb/gdbserver/ChangeLog: * target.c (thread_search_callback): Add check that the thread_stopped target callback is not NULL before calling it. --- gdb/gdbserver/ChangeLog | 6 ++++++ gdb/gdbserver/target.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 1d240f2..a80a088 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2015-12-22 Joel Brobecker + + * target.c (thread_search_callback): Add check that + the thread_stopped target callback is not NULL before + calling it. + 2015-12-21 Yao Qi * linux-aarch32-low.h [__aarch64__]: Use arm_abi_breakpoint diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c index b376ce8..59736e5 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -68,7 +68,9 @@ thread_search_callback (struct inferior_list_entry *entry, void *args) if (ptid_get_pid (entry->id) == ptid_get_pid (s->current_gen_ptid) && mythread_alive (ptid_of (thread))) { - if (s->stopped == NULL && thread_stopped (thread)) + if (s->stopped == NULL + && the_target->thread_stopped != NULL + && thread_stopped (thread)) s->stopped = thread; if (s->first == NULL) -- 2.7.4