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