In handle_event_in_failover_state(), we iterate through
queue_evt in a while loop, but process_event() can insert
items into the queue inside the loop, and we may end
up never exiting the while loop.
---
 src/amf/amfd/main.cc | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index 50daa59..e3d0957 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -406,12 +406,18 @@ static void handle_event_in_failover_state(AVD_EVT *evt) {
 
     /* Dequeue, all the messages from the queue
        and process them now */
-
-    while (!cb->evt_queue.empty()) {
+    auto size_before_loop = cb->evt_queue.size();
+    std::queue<AVD_EVT_QUEUE *>::size_type count = 0;
+    while (count < size_before_loop) {
+      // note: process_event() may insert items into
+      // the queue, so terminate loop when we have
+      // processed all the original elements
+      // to avoid infinite loop
       AVD_EVT_QUEUE *queue_evt = cb->evt_queue.front();
       cb->evt_queue.pop();
       process_event(cb, queue_evt->evt);
       delete queue_evt;
+      ++count;
     }
 
     /* Walk through all the nodes to check if any of the nodes state is
-- 
2.7.4



_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to