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