]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdbserver/linux-low.cc: Ignore event_ptid if TARGET_WAITKIND_IGNORE
authorPedro Alves <pedro@palves.net>
Tue, 5 Jul 2022 11:21:50 +0000 (12:21 +0100)
committerPedro Alves <pedro@palves.net>
Mon, 12 Dec 2022 19:04:15 +0000 (19:04 +0000)
gdbserver's linux_process_target::wait loops if called 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

gdbserver/linux-low.cc

index a7c310260ca419223dbd649463729b5506cf7bd3..8c0d3103398df98c26d47f6a5b5c80c7361fc970 100644 (file)
@@ -3636,7 +3636,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