From bcf6f5eec64643d76d34ba86249a2b3e9f8a1646 Mon Sep 17 00:00:00 2001
From: Sarangdhar Joshi <spjoshi@codeaurora.org>
Date: Wed, 1 Jul 2015 11:59:49 -0700
Subject: [PATCH] lrdpv2: Fix an infinite loop while iterating RT data
 structure

Ram dump parser compares RT data structure list head location
with first element in the list to determine whether list is
empty. However it never checks for cycle in the list and runs
forever in cases where cycle exists in the list. Fix this by
tracking the elements seen and break the loop when cycle is
found.

Change-Id: I971c59b81bf340eddff6c8225aebb163af20aba8
---
 linux-ramdump-parser-v2/parsers/runqueue.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/linux-ramdump-parser-v2/parsers/runqueue.py b/linux-ramdump-parser-v2/parsers/runqueue.py
index ed46664..41180b5 100644
--- a/linux-ramdump-parser-v2/parsers/runqueue.py
+++ b/linux-ramdump-parser-v2/parsers/runqueue.py
@@ -139,6 +139,7 @@ class RunQueues(RamParser):
             array_wsize = 4
             idx_size = 32
 
+        seen_nodes = set()
         for i in range(0, bitmap_range):
             bitmap = self.ramdump.read_word(array_addr + i * array_wsize)
             while True:
@@ -149,6 +150,9 @@ class RunQueues(RamParser):
                     queue_addr = self.ramdump.read_word(
                         array_addr + queue_offset + idx)
                     while queue_addr != array_addr + queue_offset + idx:
+                        if queue_addr in seen_nodes:
+                            break
+                        seen_nodes.add(queue_addr)
                         task_addr = queue_addr - rt_offset
                         self.print_task_state('pend', task_addr)
                         queue_addr = self.ramdump.read_word(queue_addr)
-- 
GitLab