aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2022-07-05 12:21:50 +0100
committerPedro Alves <pedro@palves.net>2023-11-13 14:16:10 +0000
commitad320fbf91e6808699cb69cccca7299a2332074d (patch)
tree630b06f7c936d7b14a109f56aab1df452bd99e3d
parent00b0dc819d1aac88ee45b18fdb05337e01a2df67 (diff)
downloadfsf-binutils-gdb-ad320fbf91e6808699cb69cccca7299a2332074d.zip
fsf-binutils-gdb-ad320fbf91e6808699cb69cccca7299a2332074d.tar.gz
fsf-binutils-gdb-ad320fbf91e6808699cb69cccca7299a2332074d.tar.bz2
gdbserver/linux-low.cc: Ignore event_ptid if TARGET_WAITKIND_IGNORE
gdbserver's linux_process_target::wait loops if: - called in sync mode, and, - wait_1 returns TARGET_WAITKIND_IGNORE, _and_, - wait_1 also returns null_ptid. The null_ptid check fails however when this path is taken: ptid_t linux_process_target::filter_exit_event (lwp_info *event_child, target_waitstatus *ourstatus) { ... if (!is_leader (thread)) { if (report_exit_events_for (thread)) ourstatus->set_thread_exited (0); else ourstatus->set_ignore (); <<<<<<< delete_lwp (event_child); } return ptid; } This makes linux_process_target::wait return TARGET_WAITKIND_IGNORE in sync mode, which is unexpected by the core and fails an assertion. This commit fixes it by just making linux_process_target::wait loop if it got a TARGET_WAITKIND_IGNORE, irrespective of event_ptid. Change-Id: I39776908a6c75cbd68aa04139ffcf7be334868cf
-rw-r--r--gdbserver/linux-low.cc1
1 files changed, 0 insertions, 1 deletions
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
index 7a4f875..ca2b7aa 100644
--- a/gdbserver/linux-low.cc
+++ b/gdbserver/linux-low.cc
@@ -3643,7 +3643,6 @@ linux_process_target::wait (ptid_t ptid,
event_ptid = wait_1 (ptid, ourstatus, target_options);
}
while ((target_options & TARGET_WNOHANG) == 0
- && event_ptid == null_ptid
&& ourstatus->kind () == TARGET_WAITKIND_IGNORE);
/* If at least one stop was reported, there may be more. A single