From b161a60d1fe2a7383c7940815687c6100b97204e Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 7 Aug 2020 10:59:33 -0400 Subject: gdb: pass target to thread_ptid_changed observable I noticed what I think is a potential bug. I did not observe it nor was I able to reproduce it using actual debugging. It's quite unlikely, because it involves multi-target and ptid clashes. I added selftests that demonstrate it though. The thread_ptid_changed observer says that thread with OLD_PTID now has NEW_PTID. Now, if for some reason we happen to have two targets defining a thread with OLD_PTID, the observers don't know which thread this is about. regcache::regcache_thread_ptid_changed changes all regcaches with OLD_PTID. If there is a regcache for a thread with ptid OLD_PTID, but that belongs to a different target, this regcache will be erroneously changed. Similarly, infrun_thread_ptid_changed updates inferior_ptid if inferior_ptid matches OLD_PTID. But if inferior_ptid currently refers not to the thread is being changed, but to a thread with the same ptid belonging to a different target, then inferior_ptid will erroneously be changed. This patch adds a `process_stratum_target *` parameter to the `thread_ptid_changed` observable and makes the two observers use it. Tests for both are added, which would fail if the corresponding fix wasn't done. gdb/ChangeLog: * observable.h (thread_ptid_changed): Add parameter `process_stratum_target *`. * infrun.c (infrun_thread_ptid_changed): Add parameter `process_stratum_target *` and use it. (selftests): New namespace. (infrun_thread_ptid_changed): New function. (_initialize_infrun): Register selftest. * regcache.c (regcache_thread_ptid_changed): Add parameter `process_stratum_target *` and use it. (regcache_thread_ptid_changed): New function. (_initialize_regcache): Register selftest. * thread.c (thread_change_ptid): Pass target to thread_ptid_changed observable. Change-Id: I0599e61224b6d154a7b55088a894cb88298c3c71 --- gdb/thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gdb/thread.c') diff --git a/gdb/thread.c b/gdb/thread.c index 4dce1ef..c915407 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -775,7 +775,7 @@ thread_change_ptid (process_stratum_target *targ, tp = find_thread_ptid (inf, old_ptid); tp->ptid = new_ptid; - gdb::observers::thread_ptid_changed.notify (old_ptid, new_ptid); + gdb::observers::thread_ptid_changed.notify (targ, old_ptid, new_ptid); } /* See gdbthread.h. */ -- cgit v1.1