From 9936510f9662335adf58c71736e4fc2a2e271a9f Mon Sep 17 00:00:00 2001
From: Laura Abbott <lauraa@codeaurora.org>
Date: Tue, 15 Apr 2014 19:04:57 -0700
Subject: [PATCH] linux-ramdump-parser-v2: Don't recurse while list walking

Many of the lists are very large and may overflow if traversed
recursively. Switch to an iterative method instead.

Change-Id: I8bf476eefae7e223a16fdd50bb9b10d7c24cb247
---
 linux-ramdump-parser-v2/linux_list.py | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/linux-ramdump-parser-v2/linux_list.py b/linux-ramdump-parser-v2/linux_list.py
index 3a3295c..cdcfca5 100644
--- a/linux-ramdump-parser-v2/linux_list.py
+++ b/linux-ramdump-parser-v2/linux_list.py
@@ -33,16 +33,22 @@ class ListWalker(object):
         self.seen_nodes = []
 
     def walk(self, node_addr, func, extra=None):
-        if node_addr != 0:
+
+        while True:
+            if node_addr == 0:
+                break
+
             func(node_addr - self.list_elem_offset, extra)
 
             next_node_addr = node_addr + self.ram_dump.field_offset('struct list_head', 'next')
             next_node = self.ram_dump.read_word(next_node_addr)
 
-            if next_node != self.last_node:
-                if next_node in self.seen_nodes:
-                    print_out_str(
-                        '[!] WARNING: Cycle found in list. List is corrupted!')
-                else:
-                    self.seen_nodes.append(node_addr)
-                    self.walk(next_node, func, extra)
+            if next_node == self.last_node:
+                break
+
+            if next_node in self.seen_nodes:
+                print_out_str(
+                   '[!] WARNING: Cycle found in attach list. List is corrupted!')
+                break
+            node_addr = next_node
+            self.seen_nodes.append(node_addr)
-- 
GitLab