From c626bebb5979047dc5d46c39b9911fa012d6a499 Mon Sep 17 00:00:00 2001 From: Mike Auty Date: Sat, 2 Jul 2016 15:48:09 +0100 Subject: [PATCH] Convert mapping to a generator rather than a list. It must still return in sorted order. --- volatility/framework/interfaces/layers.py | 2 +- volatility/framework/layers/intel.py | 12 ++++++------ volatility/framework/layers/lime.py | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/volatility/framework/interfaces/layers.py b/volatility/framework/interfaces/layers.py index fa1710f2c..bb19251a5 100644 --- a/volatility/framework/interfaces/layers.py +++ b/volatility/framework/interfaces/layers.py @@ -95,7 +95,7 @@ class TranslationLayerInterface(DataLayerInterface, metaclass = ABCMeta): @abstractmethod def mapping(self, offset, length, ignore_errors = False): - """Returns a sorted list of (offset, mapped_offset, length, layer) mappings + """Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings ignore_errors will provide all available maps with gaps, but their total length may not add up to the requested length This allows translation layers to provide maps of contiguous regions in one layer diff --git a/volatility/framework/layers/intel.py b/volatility/framework/layers/intel.py index c73bac1f9..cb1c7c597 100644 --- a/volatility/framework/layers/intel.py +++ b/volatility/framework/layers/intel.py @@ -109,29 +109,29 @@ class Intel(interfaces.layers.TranslationLayerInterface): return False def mapping(self, offset, length, ignore_errors = False): - """Returns a sorted list of (offset, mapped_offset, length, layer) mappings + """Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings This allows translation layers to provide maps of contiguous regions in one layer """ result = [] if length == 0: if ignore_errors and not self.is_valid(offset): - return result + raise StopIteration mapped_offset, _ = self._translate(offset) - return [(offset, mapped_offset, length, self._base_layer)] + yield (offset, mapped_offset, length, self._base_layer) + raise StopIteration while length > 0: if ignore_errors: while not self.is_valid(offset) and length > 0: length -= 1 << self._page_size_in_bits offset += 1 << self._page_size_in_bits if length <= 0: - return result + raise StopIteration chunk_offset, page_size = self._translate(offset) chunk_size = min(page_size - (chunk_offset % page_size), length) - result.append((offset, chunk_offset, chunk_size, self._base_layer)) + yield (offset, chunk_offset, chunk_size, self._base_layer) length -= chunk_size offset += chunk_size - return result @property def dependencies(self): diff --git a/volatility/framework/layers/lime.py b/volatility/framework/layers/lime.py index e18769eb6..c569ad9b9 100644 --- a/volatility/framework/layers/lime.py +++ b/volatility/framework/layers/lime.py @@ -105,7 +105,7 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface): return False def mapping(self, offset, length, ignore_errors = False): - """Returns a sorted list of (offset, mapped_offset, length, layer) mappings""" + """Returns a sorted iterable of (offset, mapped_offset, length, layer) mappings""" result = [] if ignore_errors: for (seg_offset, mapped_seg_offset, seg_length) in self._segments: @@ -118,20 +118,20 @@ class LimeLayer(interfaces.layers.TranslationLayerInterface): seg_offset += diff if offset + length < seg_offset + seg_length: seg_length = offset + length - seg_offset - result.append((seg_offset, mapped_seg_offset, seg_length, self._base_layer)) - return result + yield (seg_offset, mapped_seg_offset, seg_length, self._base_layer) + raise StopIteration if length == 0: logical_start, base_start, size = self._find_segment(offset) mapped_offset = offset - logical_start + base_start - return [(offset, mapped_offset, 0, self._base_layer)] + yield (offset, mapped_offset, 0, self._base_layer) + raise StopIteration while length > 0: logical_start, base_start, size = self._find_segment(offset) chunk_offset = offset - logical_start + base_start chunk_size = min(size - (offset - logical_start), length) - result.append((offset, chunk_offset, chunk_size, self._base_layer)) + yield (offset, chunk_offset, chunk_size, self._base_layer) length -= chunk_size offset += chunk_size - return result @property def dependencies(self):