Skip to content

Commit 8859d0a

Browse files
authored
Merge pull request #1543 from gcmoreira/linux_windows_harden_linked_list
Linux and Windows: Ensure linked list object extensions consistently yield valid entries
2 parents adea50a + 093b12b commit 8859d0a

File tree

2 files changed

+48
-41
lines changed

2 files changed

+48
-41
lines changed

volatility3/framework/symbols/linux/extensions/__init__.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,35 +1227,43 @@ def to_list(
12271227
Objects of the type specified via the "symbol_type" argument.
12281228
12291229
"""
1230-
layer = layer or self.vol.layer_name
1230+
layer_name = layer or self.vol.layer_name
1231+
1232+
trans_layer = self._context.layers[layer_name]
1233+
if not trans_layer.is_valid(self.vol.offset):
1234+
return None
12311235

12321236
relative_offset = self._context.symbol_space.get_type(
12331237
symbol_type
12341238
).relative_child_offset(member)
12351239

1236-
direction = "prev"
1237-
if forward:
1238-
direction = "next"
1239-
try:
1240-
link = getattr(self, direction).dereference()
1241-
except exceptions.InvalidAddressException:
1240+
direction = "next" if forward else "prev"
1241+
1242+
link_ptr = getattr(self, direction)
1243+
if not (link_ptr and link_ptr.is_readable()):
12421244
return None
1245+
link = link_ptr.dereference()
1246+
12431247
if not sentinel:
1244-
yield self._context.object(
1245-
symbol_type, layer, offset=self.vol.offset - relative_offset
1246-
)
1248+
obj_offset = self.vol.offset - relative_offset
1249+
if not trans_layer.is_valid(obj_offset):
1250+
return None
1251+
1252+
yield self._context.object(symbol_type, layer_name, offset=obj_offset)
1253+
12471254
seen = {self.vol.offset}
12481255
while link.vol.offset not in seen:
1249-
obj = self._context.object(
1250-
symbol_type, layer, offset=link.vol.offset - relative_offset
1251-
)
1252-
yield obj
1256+
obj_offset = link.vol.offset - relative_offset
1257+
if not trans_layer.is_valid(obj_offset):
1258+
return None
1259+
1260+
yield self._context.object(symbol_type, layer_name, offset=obj_offset)
12531261

12541262
seen.add(link.vol.offset)
1255-
try:
1256-
link = getattr(link, direction).dereference()
1257-
except exceptions.InvalidAddressException:
1263+
link_ptr = getattr(link, direction)
1264+
if not (link_ptr and link_ptr.is_readable()):
12581265
break
1266+
link = link_ptr.dereference()
12591267

12601268
def __iter__(self) -> Iterator[interfaces.objects.ObjectInterface]:
12611269
return self.to_list(self.vol.parent.vol.type_name, self.vol.member_name)

volatility3/framework/symbols/windows/extensions/__init__.py

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -962,56 +962,55 @@ def to_list(
962962
) -> Iterator[interfaces.objects.ObjectInterface]:
963963
"""Returns an iterator of the entries in the list."""
964964

965-
layer = layer or self.vol.layer_name
965+
layer_name = layer or self.vol.layer_name
966+
native_layer_name = layer_name or self.vol.native_layer_name
967+
968+
trans_layer = self._context.layers[layer_name]
969+
if not trans_layer.is_valid(self.vol.offset):
970+
return None
966971

967972
relative_offset = self._context.symbol_space.get_type(
968973
symbol_type
969974
).relative_child_offset(member)
970975

971-
direction = "Blink"
972-
if forward:
973-
direction = "Flink"
974-
975-
trans_layer = self._context.layers[layer]
976-
977-
try:
978-
is_valid = trans_layer.is_valid(self.vol.offset)
979-
if not is_valid:
980-
return None
976+
direction = "Flink" if forward else "Blink"
981977

982-
link = getattr(self, direction).dereference()
983-
except exceptions.InvalidAddressException:
978+
link_ptr = getattr(self, direction)
979+
if not (link_ptr and link_ptr.is_readable()):
984980
return None
981+
link = link_ptr.dereference()
985982

986983
if not sentinel:
984+
obj_offset = self.vol.offset - relative_offset
985+
if not trans_layer.is_valid(obj_offset):
986+
return None
987+
987988
yield self._context.object(
988989
symbol_type,
989-
layer,
990-
offset=self.vol.offset - relative_offset,
991-
native_layer_name=layer or self.vol.native_layer_name,
990+
layer_name,
991+
offset=obj_offset,
992+
native_layer_name=native_layer_name,
992993
)
993994

994995
seen = {self.vol.offset}
995996
while link.vol.offset not in seen:
996997
obj_offset = link.vol.offset - relative_offset
997-
998998
if not trans_layer.is_valid(obj_offset):
999999
return None
10001000

1001-
obj = self._context.object(
1001+
yield self._context.object(
10021002
symbol_type,
1003-
layer,
1003+
layer_name,
10041004
offset=obj_offset,
1005-
native_layer_name=layer or self.vol.native_layer_name,
1005+
native_layer_name=native_layer_name,
10061006
)
1007-
yield obj
10081007

10091008
seen.add(link.vol.offset)
10101009

1011-
try:
1012-
link = getattr(link, direction).dereference()
1013-
except exceptions.InvalidAddressException:
1010+
link_ptr = getattr(link, direction)
1011+
if not (link_ptr and link_ptr.is_readable()):
10141012
return None
1013+
link = link_ptr.dereference()
10151014

10161015
def __iter__(self) -> Iterator[interfaces.objects.ObjectInterface]:
10171016
return self.to_list(self.vol.parent.vol.type_name, self.vol.member_name)

0 commit comments

Comments
 (0)