aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/target.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@adacore.com>2015-12-20 00:49:59 -0500
committerJoel Brobecker <brobecker@adacore.com>2015-12-22 19:26:17 +0400
commit0e50fe5ca6ed2ce780cbbfa516aec20b023433ce (patch)
treee5a293fe714e7232cba5aff548f6f92daf90704e /gdb/gdbserver/target.c
parentaec47d1d54be415050bbd3ccb93c0157d60ed92d (diff)
downloadgdb-0e50fe5ca6ed2ce780cbbfa516aec20b023433ce.zip
gdb-0e50fe5ca6ed2ce780cbbfa516aec20b023433ce.tar.gz
gdb-0e50fe5ca6ed2ce780cbbfa516aec20b023433ce.tar.bz2
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.
Diffstat (limited to 'gdb/gdbserver/target.c')
-rw-r--r--gdb/gdbserver/target.c4
1 files changed, 3 insertions, 1 deletions
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)