diff --git a/linux-ramdump-parser-v2/linux_list.py b/linux-ramdump-parser-v2/linux_list.py index 3a3295c24a36111896f20e4bef2d1622a8c24800..cdcfca542f53550ed2729ee73d26d5d6b34a5e63 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)