diff options
author | Joel Brobecker <brobecker@adacore.com> | 2015-12-20 00:49:59 -0500 |
---|---|---|
committer | Joel Brobecker <brobecker@adacore.com> | 2015-12-22 19:26:17 +0400 |
commit | 0e50fe5ca6ed2ce780cbbfa516aec20b023433ce (patch) | |
tree | e5a293fe714e7232cba5aff548f6f92daf90704e /gdb | |
parent | aec47d1d54be415050bbd3ccb93c0157d60ed92d (diff) | |
download | gdb-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')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/target.c | 4 |
2 files changed, 9 insertions, 1 deletions
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 <brobecker@adacore.com> + + * target.c (thread_search_callback): Add check that + the thread_stopped target callback is not NULL before + calling it. + 2015-12-21 Yao Qi <yao.qi@linaro.org> * 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) |