Author: tross
Date: Wed Jun 9 18:17:19 2010
New Revision: 953107
URL: http://svn.apache.org/viewvc?rev=953107&view=rev
Log:
Cleaned up the storage of RemoteAgents in ManagementAgent.
This closes a window of opportunity for a double-free.
Modified:
qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp?rev=953107&r1=953106&r2=953107&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp Wed Jun 9
18:17:19 2010
@@ -1390,31 +1390,26 @@ uint32_t ManagementAgent::assignBankLH (
void ManagementAgent::deleteOrphanedAgentsLH()
{
- vector<ObjectId> deleteList;
+ list<ObjectId> deleteList;
- for (RemoteAgentMap::iterator aIter = remoteAgents.begin(); aIter !=
remoteAgents.end(); aIter++) {
- ObjectId connectionRef = aIter->first;
+ for (RemoteAgentMap::const_iterator aIter = remoteAgents.begin(); aIter !=
remoteAgents.end(); aIter++) {
bool found = false;
for (ManagementObjectMap::iterator iter = managementObjects.begin();
iter != managementObjects.end();
iter++) {
- if (iter->first == connectionRef && !iter->second->isDeleted()) {
+ if (iter->first == aIter->first && !iter->second->isDeleted()) {
found = true;
break;
}
}
- if (!found) {
- deleteList.push_back(connectionRef);
- delete aIter->second;
- }
+ if (!found)
+ deleteList.push_back(aIter->first);
}
- for (vector<ObjectId>::iterator dIter = deleteList.begin(); dIter !=
deleteList.end(); dIter++)
+ for (list<ObjectId>::const_iterator dIter = deleteList.begin(); dIter !=
deleteList.end(); dIter++)
remoteAgents.erase(*dIter);
-
- deleteList.clear();
}
void ManagementAgent::handleAttachRequestLH (Buffer& inBuffer, const string&
replyToKey, uint32_t sequence, const ConnectionToken* connToken)
@@ -1444,12 +1439,12 @@ void ManagementAgent::handleAttachReques
assignedBank = assignBankLH(requestedAgentBank);
- RemoteAgent* agent = new RemoteAgent(*this);
+ boost::shared_ptr<RemoteAgent> agent(new RemoteAgent(*this));
agent->brokerBank = brokerBank;
agent->agentBank = assignedBank;
agent->routingKey = replyToKey;
agent->connectionRef = connectionRef;
- agent->mgmtObject = new _qmf::Agent (this, agent);
+ agent->mgmtObject = new _qmf::Agent (this, agent.get());
agent->mgmtObject->set_connectionRef(agent->connectionRef);
agent->mgmtObject->set_label (label);
agent->mgmtObject->set_registeredTo
(broker->GetManagementObject()->getObjectId());
@@ -2289,7 +2284,7 @@ void ManagementAgent::exportAgents(strin
++i)
{
// TODO aconway 2010-03-04: see comment in
ManagementAgent::RemoteAgent::encode
- RemoteAgent* agent = i->second;
+ boost::shared_ptr<RemoteAgent> agent(i->second);
map_.clear();
amap.clear();
@@ -2310,7 +2305,7 @@ void ManagementAgent::importAgents(qpid:
sys::Mutex::ScopedLock lock(userLock);
for (l = content.begin(); l != content.end(); l++) {
- auto_ptr<RemoteAgent> agent(new RemoteAgent(*this));
+ boost::shared_ptr<RemoteAgent> agent(new RemoteAgent(*this));
Variant::Map map_;
Variant::Map::const_iterator i;
@@ -2321,7 +2316,7 @@ void ManagementAgent::importAgents(qpid:
agent->mapDecode(i->second.asMap());
addObject (agent->mgmtObject, 0, false);
- remoteAgents[agent->connectionRef] = agent.release();
+ remoteAgents[agent->connectionRef] = agent;
}
}
}
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h?rev=953107&r1=953106&r2=953107&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.h Wed Jun 9
18:17:19 2010
@@ -175,11 +175,7 @@ private:
void mapDecode(const qpid::types::Variant::Map& _map);
};
- // TODO: Eventually replace string with entire reply-to structure.
reply-to
- // currently assumes that the exchange is "amq.direct" even though
it could
- // in theory be specified differently.
- typedef std::map<ObjectId, RemoteAgent*> RemoteAgentMap;
- typedef std::vector<std::string> ReplyToVector;
+ typedef std::map<ObjectId, boost::shared_ptr<RemoteAgent> > RemoteAgentMap;
// Storage for known schema classes:
//
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:[email protected]