Skip to content

Commit f874712

Browse files
committed
Move more of the UDF logical volume integrity parsing to udf.py
Signed-off-by: Chris Lalancette <clalancette@openrobotics.org>
1 parent eb28c17 commit f874712

File tree

2 files changed

+40
-21
lines changed

2 files changed

+40
-21
lines changed

pycdlib/pycdlib.py

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2052,26 +2052,11 @@ def _parse_udf_descriptors(self):
20522052
self._seek_to_extent(self.udf_main_descs.logical_volumes[0].integrity_sequence.extent_location)
20532053
integrity_data = self._cdfp.read(self.udf_main_descs.logical_volumes[0].integrity_sequence.extent_length)
20542054

2055-
offset = 0
2056-
current_extent = self.udf_main_descs.logical_volumes[0].integrity_sequence.extent_location
2057-
desc_tag = udfmod.UDFTag()
2058-
desc_tag.parse(integrity_data[offset:], current_extent)
2059-
if desc_tag.tag_ident != 9:
2060-
raise pycdlibexception.PyCdlibInvalidISO('UDF Volume Integrity Tag identifier not 9')
2061-
self.udf_logical_volume_integrity = udfmod.UDFLogicalVolumeIntegrityDescriptor()
2062-
self.udf_logical_volume_integrity.parse(integrity_data[offset:offset + 512],
2063-
current_extent, desc_tag)
2064-
2065-
offset += self.logical_block_size
2066-
if len(integrity_data) >= (offset + self.logical_block_size):
2067-
current_extent += 1
2068-
desc_tag = udfmod.UDFTag()
2069-
desc_tag.parse(integrity_data[offset:], current_extent)
2070-
if desc_tag.tag_ident != 8:
2071-
raise pycdlibexception.PyCdlibInvalidISO('UDF Logical Volume Integrity Terminator Tag identifier not 8')
2072-
self.udf_logical_volume_integrity_terminator = udfmod.UDFTerminatingDescriptor()
2073-
self.udf_logical_volume_integrity_terminator.parse(current_extent,
2074-
desc_tag)
2055+
ulvi, ulvi_term = udfmod.parse_logical_volume_integrity(integrity_data,
2056+
self.udf_main_descs.logical_volumes[0].integrity_sequence.extent_location,
2057+
self.logical_block_size)
2058+
self.udf_logical_volume_integrity = ulvi
2059+
self.udf_logical_volume_integrity_terminator = ulvi_term
20752060

20762061
# Now look for the File Set Descriptor.
20772062
current_extent = self.udf_main_descs.partitions[0].part_start_location

pycdlib/udf.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
# For mypy annotations
3434
if False: # pylint: disable=using-constant-test
35-
from typing import List, Optional, Type, Union # NOQA pylint: disable=unused-import
35+
from typing import List, Optional, Tuple, Type, Union # NOQA pylint: disable=unused-import
3636
# NOTE: this import has to be here to avoid circular deps
3737
from pycdlib import inode # NOQA pylint: disable=unused-import
3838

@@ -5786,3 +5786,37 @@ def parse_anchor(anchor_data, anchor_location):
57865786
anchor = UDFAnchorVolumeStructure()
57875787
anchor.parse(anchor_data, anchor_location, anchor_tag)
57885788
return anchor
5789+
5790+
5791+
def parse_logical_volume_integrity(integrity_data, current_extent, logical_block_size):
5792+
# type: (bytes, int, int) -> Tuple[UDFLogicalVolumeIntegrityDescriptor, Optional[UDFTerminatingDescriptor]]
5793+
"""
5794+
An internal method to parse Logical Volume Integrity data, and an optional
5795+
Logical Volume Integrity Terminator.
5796+
5797+
Parameters:
5798+
integrity_data - The data to parse.
5799+
current_extent - The extent location of the data.
5800+
logical_block_size - The logical block size of the ISO.
5801+
Returns:
5802+
A tuple where the first item is a UDFLogicalVolumeIntegrityDescriptor, and
5803+
the second item is a optional UDFTerminatorDescriptor.
5804+
"""
5805+
desc_tag = UDFTag()
5806+
desc_tag.parse(integrity_data, current_extent)
5807+
if desc_tag.tag_ident != 9:
5808+
raise pycdlibexception.PyCdlibInvalidISO('UDF Volume Integrity Tag identifier not 9')
5809+
logical_volume_integrity = UDFLogicalVolumeIntegrityDescriptor()
5810+
logical_volume_integrity.parse(integrity_data[:512], current_extent, desc_tag)
5811+
5812+
logical_volume_integrity_terminator = None
5813+
offset = logical_block_size
5814+
if len(integrity_data) >= (offset + logical_block_size):
5815+
desc_tag = UDFTag()
5816+
desc_tag.parse(integrity_data[offset:], current_extent + 1)
5817+
if desc_tag.tag_ident != 8:
5818+
raise pycdlibexception.PyCdlibInvalidISO('UDF Logical Volume Integrity Terminator Tag identifier not 8')
5819+
logical_volume_integrity_terminator = UDFTerminatingDescriptor()
5820+
logical_volume_integrity_terminator.parse(current_extent + 1, desc_tag)
5821+
5822+
return logical_volume_integrity, logical_volume_integrity_terminator

0 commit comments

Comments
 (0)