]> granicus.if.org Git - icinga2/commitdiff
Fixed weak ptr deref bug.
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 20 Apr 2012 14:21:43 +0000 (16:21 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 20 Apr 2012 14:25:05 +0000 (16:25 +0200)
base/application.cpp
base/timer.cpp

index 8a1eeb3d909801be1eebd768ec49babcafa22f6f..20ba6561cf6ce4ee515878a3429a3aec8126c4c3 100644 (file)
@@ -59,11 +59,17 @@ void Application::RunEventLoop(void)
                FD_ZERO(&writefds);
                FD_ZERO(&exceptfds);
 
-               for (Socket::CollectionType::iterator i = Socket::Sockets.begin(); i != Socket::Sockets.end(); i++) {
+               Socket::CollectionType::iterator prev, i;
+               for (i = Socket::Sockets.begin(); i != Socket::Sockets.end(); ) {
                        Socket::Ptr socket = i->lock();
 
-                       if (socket == NULL)
+                       prev = i;
+                       i++;
+
+                       if (!socket) {
+                               Socket::Sockets.erase(prev);
                                continue;
+                       }
 
                        int fd = socket->GetFD();
 
@@ -106,15 +112,16 @@ void Application::RunEventLoop(void)
                EventArgs ea;
                ea.Source = shared_from_this();
 
-               Socket::CollectionType::iterator prev, i;
                for (i = Socket::Sockets.begin(); i != Socket::Sockets.end(); ) {
+                       Socket::Ptr socket = i->lock();
+
                        prev = i;
                        i++;
 
-                       Socket::Ptr socket = prev->lock();
-
-                       if (socket == NULL)
+                       if (!socket) {
+                               Socket::Sockets.erase(prev);
                                continue;
+                       }
 
                        int fd = socket->GetFD();
 
index 1e28bab7bbc605b85fa44f4ebe02081cbb74df6e..b7b9f034178b66834deba5e907234c52f4344863 100644 (file)
@@ -42,12 +42,17 @@ void Timer::CallExpiredTimers(void)
 
        time(&now);
 
-       for (Timer::CollectionType::iterator i = Timers.begin(); i != Timers.end(); ) {
-               Timer::Ptr timer = Timer::Ptr(*i);
+       Timer::CollectionType::iterator prev, i;
+       for (i = Timers.begin(); i != Timers.end(); ) {
+               Timer::Ptr timer = i->lock();
+
+               prev = i;
                i++;
 
-               if (timer == NULL)
+               if (!timer) {
+                       Timers.erase(prev);
                        continue;
+               }
 
                if (timer->m_Next <= now) {
                        timer->Call();