dissect.archive 1.9.dev3__tar.gz → 1.9.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/PKG-INFO +1 -1
  2. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/lsm.py +6 -1
  3. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/PKG-INFO +1 -1
  4. dissect_archive-1.9.dev4/dissect.archive.egg-info/scm_version.json +8 -0
  5. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_lsm.py +7 -0
  6. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_tibx_acronis.py +7 -1
  7. dissect_archive-1.9.dev3/dissect.archive.egg-info/scm_version.json +0 -8
  8. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/.git-blame-ignore-revs +0 -0
  9. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/.gitattributes +0 -0
  10. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/COPYRIGHT +0 -0
  11. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/LICENSE +0 -0
  12. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/MANIFEST.in +0 -0
  13. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/README.md +0 -0
  14. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/__init__.py +0 -0
  15. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/c_vbk.py +0 -0
  16. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/c_vma.py +0 -0
  17. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/c_wim.py +0 -0
  18. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/exceptions.py +0 -0
  19. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/__init__.py +0 -0
  20. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/c_tibx.py +0 -0
  21. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/c_tibx.pyi +0 -0
  22. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/codec.py +0 -0
  23. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/crypto.py +0 -0
  24. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/exception.py +0 -0
  25. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/map.py +0 -0
  26. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/page.py +0 -0
  27. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/segment.py +0 -0
  28. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/stream.py +0 -0
  29. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tibx/tibx.py +0 -0
  30. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tools/__init__.py +0 -0
  31. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/tools/backup.py +0 -0
  32. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/vbk.py +0 -0
  33. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/vma.py +0 -0
  34. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/wim.py +0 -0
  35. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect/archive/xva.py +0 -0
  36. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/SOURCES.txt +0 -0
  37. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/dependency_links.txt +0 -0
  38. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/entry_points.txt +0 -0
  39. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/requires.txt +0 -0
  40. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/scm_file_list.json +0 -0
  41. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/dissect.archive.egg-info/top_level.txt +0 -0
  42. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/pyproject.toml +0 -0
  43. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/setup.cfg +0 -0
  44. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/__init__.py +0 -0
  45. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/ati_2020_disk_enc_lz4_compr.tibx +0 -0
  46. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/ati_2020_disk_lz4_compr.tibx +0 -0
  47. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_chain_diff-0001.tibx +0 -0
  48. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_chain_diff.tibx +0 -0
  49. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_chain_inc.tibx +0 -0
  50. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_disk_gpt.tibx +0 -0
  51. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_disk_mbr.tibx +0 -0
  52. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_empty_ntfs.tibx +0 -0
  53. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_enc_aes.tibx +0 -0
  54. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_legacy_tib.tibx +0 -0
  55. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_multivol.tibx +0 -0
  56. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_simple_ntfs.tibx +0 -0
  57. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/acronis/tibx/t1_stored.tibx +0 -0
  58. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/basic16k.wim.gz +0 -0
  59. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/basic32k.wim.gz +0 -0
  60. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/basic4k.wim.gz +0 -0
  61. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/basic8k.wim.gz +0 -0
  62. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/test.vma.gz +0 -0
  63. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/test13.vbk.gz +0 -0
  64. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_data/test9.vbk.gz +0 -0
  65. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_docs/Makefile +0 -0
  66. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_docs/__init__.py +0 -0
  67. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_docs/conf.py +0 -0
  68. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_docs/index.rst +0 -0
  69. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_tools/__init__.py +0 -0
  70. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_tools/tibx/__init__.py +0 -0
  71. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/_tools/tibx/_synth.py +0 -0
  72. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/conftest.py +0 -0
  73. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/test_exceptions.py +0 -0
  74. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/test_vbk.py +0 -0
  75. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/test_vma.py +0 -0
  76. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/test_wim.py +0 -0
  77. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/__init__.py +0 -0
  78. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_codec.py +0 -0
  79. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_crypto.py +0 -0
  80. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_page.py +0 -0
  81. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_recovery.py +0 -0
  82. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_segment.py +0 -0
  83. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tests/tibx/test_tibx.py +0 -0
  84. {dissect_archive-1.9.dev3 → dissect_archive-1.9.dev4}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.archive
3
- Version: 1.9.dev3
3
+ Version: 1.9.dev4
4
4
  Summary: A Dissect module implementing parsers for various archive and backup formats
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -87,7 +87,12 @@ class LsmSuperBlock:
87
87
  if payload[:4] != LSM_MAGIC_SUPERBLOCK:
88
88
  raise CorruptArchiveError(f"L-SB magic missing in TLV slot {tlv_index}")
89
89
  self.tlv_index = tlv_index
90
- self.sb = c_tibx.lsm_superblock(payload)
90
+ try:
91
+ self.sb = c_tibx.lsm_superblock(payload)
92
+ except EOFError:
93
+ # The header of an archive cut off after its first page is short, and so is the
94
+ # L-SB that runs past the cut
95
+ raise CorruptArchiveError(f"L-SB truncated in TLV slot {tlv_index}")
91
96
  self.seq = self.sb.seq
92
97
  self.key_length = self.sb.key_length
93
98
  self.value_length = self.sb.value_length
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.archive
3
- Version: 1.9.dev3
3
+ Version: 1.9.dev4
4
4
  Summary: A Dissect module implementing parsers for various archive and backup formats
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.8",
3
+ "distance": 4,
4
+ "node": "gb1d24d6f37641bc989d1ce9614238ff6bbdc207f",
5
+ "dirty": true,
6
+ "branch": "main",
7
+ "node_date": "2026-11-04"
8
+ }
@@ -122,6 +122,13 @@ def test_lsb_parse_memtree_and_ctrees() -> None:
122
122
  assert not LsmSuperBlock(lsb(8, 4), tlv_index=1).has_records
123
123
 
124
124
 
125
+ def test_lsb_truncated() -> None:
126
+ # cstruct raises EOFError on a short buffer; callers should only ever see the parser's
127
+ # own exception type.
128
+ with pytest.raises(CorruptArchiveError, match="L-SB truncated in TLV slot 1"):
129
+ LsmSuperBlock(lsb(8, 4)[:16], tlv_index=1)
130
+
131
+
125
132
  def test_lsb_ignores_slots_past_nr_ctree() -> None:
126
133
  # Acronis reads only nr_ctree slots: a stale ctree past them is not part of the tree
127
134
  payload = bytearray(lsb(8, 4, ctrees=[(3 * PAGE, 5)]))
@@ -18,7 +18,7 @@ import io
18
18
  import pytest
19
19
 
20
20
  from dissect.archive.tibx.c_tibx import PAGE_SIZE, TLV_SEGMENT_MAP, c_tibx
21
- from dissect.archive.tibx.exception import InvalidPasswordError
21
+ from dissect.archive.tibx.exception import CorruptArchiveError, InvalidPasswordError
22
22
  from dissect.archive.tibx.lsm import iter_tree_cells
23
23
  from dissect.archive.tibx.map import load_segment_index
24
24
  from dissect.archive.tibx.page import (
@@ -457,3 +457,9 @@ def test_acronis_commit_info_crc64_mismatch() -> None:
457
457
  store = PageStore(io.BytesIO(bytes(data)))
458
458
  assert store._commit_info_at(0xF6000) is None
459
459
  assert store.live_root().offset == 0xB6000
460
+
461
+
462
+ def test_acronis_truncated_header() -> None:
463
+ # Cut off after its first page, the archive holds only part of its two-page ARCH header
464
+ with pytest.raises(CorruptArchiveError, match="L-SB truncated"):
465
+ TIBX(io.BytesIO(_sample("t1_chain_inc")[:PAGE_SIZE]))
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "1.8",
3
- "distance": 3,
4
- "node": "g8671dd45241e374c0e0ffe50747e8f6254161339",
5
- "dirty": true,
6
- "branch": "main",
7
- "node_date": "2026-11-03"
8
- }