]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Fix crash in aarch64-linux gdbserver
authorPedro Alves <pedro@palves.net>
Wed, 7 Feb 2024 18:48:16 +0000 (18:48 +0000)
committerPedro Alves <pedro@palves.net>
Fri, 9 Feb 2024 11:58:40 +0000 (11:58 +0000)
Since commit 393a6b5947d0 ("Thread options & clone events (Linux
GDBserver)"), aarch64-linux gdbserver crashes when the inferior
vforks.  This happens in aarch64_get_debug_reg_state:

  struct process_info *proc = find_process_pid (pid);

  return &proc->priv->arch_private->debug_reg_state;

Here, find_process_pid returns nullptr -- the new inferior hasn't yet
been created in linux_process_target::handle_extended_wait.

This patch fixes the problem by having
linux_process_target::handle_extended_wait create the child process
earlier, before the child LWP is created.  This is what the function
did before it was reorganized by the commit referred above.

Change-Id: Ib8b3a2e6048c3ad2b91a92ea4430da507db03c50
Co-Authored-By: Tom Tromey <tromey@adacore.com>
gdbserver/linux-low.cc

index 444eebc6bbef3732e534bf8f71e6ea0f2e469206..9d5a624280346537074d212268280f0663ff7ebe 100644 (file)
@@ -555,6 +555,16 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
                           ? ptid_t (new_pid, new_pid)
                           : ptid_t (ptid_of (event_thr).pid (), new_pid));
 
+      process_info *child_proc = nullptr;
+
+      if (event != PTRACE_EVENT_CLONE)
+       {
+         /* Add the new process to the tables before we add the LWP.
+            We need to do this even if the new process will be
+            detached.  See breakpoint cloning code further below.  */
+         child_proc = add_linux_process (new_pid, 0);
+       }
+
       lwp_info *child_lwp = add_lwp (child_ptid);
       gdb_assert (child_lwp != NULL);
       child_lwp->stopped = 1;
@@ -588,12 +598,11 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
 
       if (event != PTRACE_EVENT_CLONE)
        {
-         /* Add the new process to the tables and clone the breakpoint
-            lists of the parent.  We need to do this even if the new process
-            will be detached, since we will need the process object and the
-            breakpoints to remove any breakpoints from memory when we
-            detach, and the client side will access registers.  */
-         process_info *child_proc = add_linux_process (new_pid, 0);
+         /* Clone the breakpoint lists of the parent.  We need to do
+            this even if the new process will be detached, since we
+            will need the process object and the breakpoints to
+            remove any breakpoints from memory when we detach, and
+            the client side will access registers.  */
          gdb_assert (child_proc != NULL);
 
          process_info *parent_proc = get_thread_process (event_thr);