From 61f0bf59fb0177170bb9f590761554ec1e06a12c Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Mon, 25 Apr 2016 21:49:46 -0400 Subject: [PATCH] Debugger: Fix handling of team_id clashes. TeamDebugger: - Add accessor to query whether the debugger's interface is a post mortem core rather than a live team. TargetHostInterface: - When asked to locate a team debugger by team_id, as is done for attach requests to determine if we already have an existing instance attached, skip over post mortems. This takes care of the potential problem of detecting a core instance with the same team_id as a live team, and consequently refusing the attach request. - When a team debugger quits, use its actual pointer to look it up rather than its team ID, as we could otherwise potentially remove the wrong one in the case of a clash. --- .../debugger/controllers/TeamDebugger.cpp | 2 ++ src/apps/debugger/controllers/TeamDebugger.h | 3 ++ .../TargetHostInterface.cpp | 30 ++++++++----------- .../TargetHostInterface.h | 2 -- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/apps/debugger/controllers/TeamDebugger.cpp b/src/apps/debugger/controllers/TeamDebugger.cpp index c891bf86fa1..94d1bb7f51f 100644 --- a/src/apps/debugger/controllers/TeamDebugger.cpp +++ b/src/apps/debugger/controllers/TeamDebugger.cpp @@ -218,6 +218,7 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface, fSettingsManager(settingsManager), fTeam(NULL), fTeamID(-1), + fIsPostMortem(false), fImageHandlers(NULL), fImageInfoPendingThreads(NULL), fDebuggerInterface(NULL), @@ -337,6 +338,7 @@ TeamDebugger::Init(DebuggerInterface* interface, thread_id threadID, int argc, fDebuggerInterface = interface; fDebuggerInterface->AcquireReference(); fTeamID = interface->TeamID(); + fIsPostMortem = interface->IsPostMortem(); // create file manager diff --git a/src/apps/debugger/controllers/TeamDebugger.h b/src/apps/debugger/controllers/TeamDebugger.h index f030618c430..043e19a1269 100644 --- a/src/apps/debugger/controllers/TeamDebugger.h +++ b/src/apps/debugger/controllers/TeamDebugger.h @@ -51,6 +51,8 @@ class TeamDebugger : public BLooper, private UserInterfaceListener, team_id TeamID() const { return fTeamID; } + bool IsPostMortem() const { return fIsPostMortem; } + int ArgumentCount() const { return fCommandLineArgc; } const char** Arguments() const @@ -245,6 +247,7 @@ class TeamDebugger : public BLooper, private UserInterfaceListener, SettingsManager* fSettingsManager; ::Team* fTeam; team_id fTeamID; + bool fIsPostMortem; ThreadHandlerTable fThreadHandlers; // protected by the team lock ImageHandlerTable* fImageHandlers; diff --git a/src/apps/debugger/target_host_interface/TargetHostInterface.cpp b/src/apps/debugger/target_host_interface/TargetHostInterface.cpp index bb933b38fc0..a910025aa9d 100644 --- a/src/apps/debugger/target_host_interface/TargetHostInterface.cpp +++ b/src/apps/debugger/target_host_interface/TargetHostInterface.cpp @@ -110,7 +110,13 @@ TargetHostInterface::TeamDebuggerAt(int32 index) const TeamDebugger* TargetHostInterface::FindTeamDebugger(team_id team) const { - return fTeamDebuggers.BinarySearchByKey(team, &_FindDebuggerByKey); + for (int32 i = 0; i < fTeamDebuggers.CountItems(); i++) { + TeamDebugger* debugger = fTeamDebuggers.ItemAt(i); + if (debugger->TeamID() == team && !debugger->IsPostMortem()) + return debugger; + } + + return NULL; } @@ -127,10 +133,12 @@ TargetHostInterface::AddTeamDebugger(TeamDebugger* debugger) void TargetHostInterface::RemoveTeamDebugger(TeamDebugger* debugger) { - int32 index = fTeamDebuggers.BinarySearchIndexByKey(debugger->TeamID(), - &_FindDebuggerByKey); - if (index >= 0) - fTeamDebuggers.RemoveItemAt(index); + for (int32 i = 0; i < fTeamDebuggers.CountItems(); i++) { + if (fTeamDebuggers.ItemAt(i) == debugger) { + fTeamDebuggers.RemoveItemAt(i); + break; + } + } } @@ -317,18 +325,6 @@ TargetHostInterface::_CompareDebuggers(const TeamDebugger* a, } -/*static*/ int -TargetHostInterface::_FindDebuggerByKey(const team_id* team, - const TeamDebugger* debugger) -{ - if (*team < debugger->TeamID()) - return -1; - else if (*team > debugger->TeamID()) - return 1; - return 0; -} - - // #pragma mark - TargetHostInterface::Listener diff --git a/src/apps/debugger/target_host_interface/TargetHostInterface.h b/src/apps/debugger/target_host_interface/TargetHostInterface.h index 88923aa648d..0ea254fd849 100644 --- a/src/apps/debugger/target_host_interface/TargetHostInterface.h +++ b/src/apps/debugger/target_host_interface/TargetHostInterface.h @@ -84,8 +84,6 @@ class TargetHostInterface : public BLooper, private TeamDebugger::Listener { static int _CompareDebuggers(const TeamDebugger* a, const TeamDebugger* b); - static int _FindDebuggerByKey(const team_id* team, - const TeamDebugger* debugger); private: typedef DoublyLinkedList ListenerList; typedef BObjectList TeamDebuggerList;