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]

Reply via email to