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.
This commit is contained in:
Rene Gollent 2016-04-25 21:49:46 -04:00
parent 2c4195e840
commit 61f0bf59fb
4 changed files with 18 additions and 19 deletions

View File

@ -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

View File

@ -51,6 +51,8 @@ public:
team_id TeamID() const { return fTeamID; }
bool IsPostMortem() const { return fIsPostMortem; }
int ArgumentCount() const
{ return fCommandLineArgc; }
const char** Arguments() const
@ -245,6 +247,7 @@ private:
SettingsManager* fSettingsManager;
::Team* fTeam;
team_id fTeamID;
bool fIsPostMortem;
ThreadHandlerTable fThreadHandlers;
// protected by the team lock
ImageHandlerTable* fImageHandlers;

View File

@ -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

View File

@ -84,8 +84,6 @@ private:
static int _CompareDebuggers(const TeamDebugger* a,
const TeamDebugger* b);
static int _FindDebuggerByKey(const team_id* team,
const TeamDebugger* debugger);
private:
typedef DoublyLinkedList<Listener> ListenerList;
typedef BObjectList<TeamDebugger> TeamDebuggerList;