From: Pedro Alves Date: Wed, 7 Feb 2024 18:48:16 +0000 (+0000) Subject: Fix crash in aarch64-linux gdbserver X-Git-Tag: gdb-15-branchpoint~1009 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=38065394e9646db0aff89b58d1d09f94bb1f626e;p=thirdparty%2Fbinutils-gdb.git Fix crash in aarch64-linux gdbserver 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 --- diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 444eebc6bbe..9d5a6242803 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -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);