From b052c4fbf5e64a2e96452642adf433f60b185245 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 10 Feb 2015 19:13:31 +0000 Subject: [PATCH] displaced_step_fixup may access memory from the wrong inferior/thread displaced_step_fixup takes an thread to work with, as argument. OTOH, gdbarch_displaced_step_fixup fixes up the current thread. The former calls the latter without making sure the current thread is the one that was passed in. If it is not, then gdbarch_displaced_step_fixup may e.g., try reading from a running thread, which doesn't work on some targets, or worse, read memory from the wrong inferior and succeed. This is mostly a latent problem currently, as non-stop switches the current thread to the event thread early in fetch_inferior_event. Tested on x86_64 Fedora 20. gdb/ 2015-02-10 Pedro Alves * infrun.c (displaced_step_fixup): Switch to the event thread before calling gdbarch_displaced_step_fixup. --- gdb/ChangeLog | 5 +++++ gdb/infrun.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 08575ff5015..58df0ca592a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-02-10 Pedro Alves + + * infrun.c (displaced_step_fixup): Switch to the event thread + before calling gdbarch_displaced_step_fixup. + 2015-02-10 Antoine Tremblay * MAINTAINERS (Write After Approval): Add Antoine Tremblay. diff --git a/gdb/infrun.c b/gdb/infrun.c index 11dcc0ef1fb..5770d773e0a 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1784,6 +1784,10 @@ displaced_step_fixup (ptid_t event_ptid, enum gdb_signal signal) /* Did the instruction complete successfully? */ if (signal == GDB_SIGNAL_TRAP) { + /* Fixup may need to read memory/registers. Switch to the + thread that we're fixing up. */ + switch_to_thread (event_ptid); + /* Fix up the resulting state. */ gdbarch_displaced_step_fixup (displaced->step_gdbarch, displaced->step_closure, -- 2.30.2