Skip to content

Commit

Permalink
Debugger: Fix handling of team_id clashes.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
anevilyak committed Apr 26, 2016
1 parent 2c4195e commit 61f0bf5
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 19 deletions.
2 changes: 2 additions & 0 deletions src/apps/debugger/controllers/TeamDebugger.cpp
Expand Up @@ -218,6 +218,7 @@ TeamDebugger::TeamDebugger(Listener* listener, UserInterface* userInterface,
fSettingsManager(settingsManager),
fTeam(NULL),
fTeamID(-1),
fIsPostMortem(false),
fImageHandlers(NULL),
fImageInfoPendingThreads(NULL),
fDebuggerInterface(NULL),
Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/apps/debugger/controllers/TeamDebugger.h
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
30 changes: 13 additions & 17 deletions src/apps/debugger/target_host_interface/TargetHostInterface.cpp
Expand Up @@ -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;
}


Expand All @@ -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;
}
}
}


Expand Down Expand Up @@ -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


Expand Down
2 changes: 0 additions & 2 deletions src/apps/debugger/target_host_interface/TargetHostInterface.h
Expand Up @@ -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<Listener> ListenerList;
typedef BObjectList<TeamDebugger> TeamDebuggerList;
Expand Down

0 comments on commit 61f0bf5

Please sign in to comment.