From 15a8af5c93bbef025fc0c0d3fcb69abc83854f9e Mon Sep 17 00:00:00 2001 From: Abyss Watcher Date: Wed, 7 May 2025 16:10:37 +0200 Subject: [PATCH] use dynamically_sized_array_of_pointers in _get_sect_count --- .../symbols/linux/extensions/__init__.py | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/volatility3/framework/symbols/linux/extensions/__init__.py b/volatility3/framework/symbols/linux/extensions/__init__.py index 22eb46460..22d06baea 100644 --- a/volatility3/framework/symbols/linux/extensions/__init__.py +++ b/volatility3/framework/symbols/linux/extensions/__init__.py @@ -198,21 +198,17 @@ class module(generic.GenericIntelProcess): ) return 0 - entry = arr_offset.dereference() - symbol_table_name = self.get_symbol_table_name() - idx = 0 - while entry.is_readable(): - idx += 1 - entry = self._context.object( - symbol_table_name + constants.BANG + "pointer", - layer_name=self.vol.layer_name, - offset=entry.vol.offset - + self._context.symbol_space.get_type( - symbol_table_name + constants.BANG + "pointer" - ).size, - ) - - return idx + # We chose 1000 as an arbitrary guard value against + # extreme cases of smearing. + # See PR #1773 for more information. + bin_attrs_list = utility.dynamically_sized_array_of_pointers( + context=self._context, + layer_name=self.vol.layer_name, + symbol_table_name=self.get_symbol_table_name(), + array_offset=arr_offset.dereference().vol.offset, + iterator_guard_value=1000, + ) + return len(bin_attrs_list) @functools.cached_property def number_of_sections(self) -> int: