, RecoverCorruptHeaderGZMultiTest \
, RecoverCorruptHeaderGZAESSingleTest \
, RecoverCorruptHeaderGZAESMultiTest \
+ , RecoverCorruptTruncateTest \
+ , RecoverCorruptTruncateGZTest \
+ , RecoverCorruptTruncateGZAESTest \
, RescueCorruptHeaderCTSizeGZAESTest \
, RecoverCorruptEntireHeaderSingleTest \
, RecoverCorruptEntireHeaderMultiTest \
, RecoverCorruptHoleTest \
, RecoverCorruptHoleGZTest \
, RecoverCorruptHoleGZAESTest \
+ , RescueCorruptTruncateTest \
+ , RescueCorruptTruncateGZTest \
+ , RescueCorruptTruncateGZAESTest \
, RescueCorruptHoleTest \
, RescueCorruptHoleGZTest \
, RescueCorruptHoleGZAESTest \
, GenIndexIntactMultiTest \
, GenIndexIntactMultiGZTest \
, GenIndexIntactMultiGZAESTest \
+ , GenIndexCorruptTruncateTest \
+ , GenIndexCorruptTruncateGZTest \
+ , GenIndexCorruptTruncateGZAESTest \
, GenIndexCorruptHoleTest \
, GenIndexCorruptHoleGZTest \
, GenIndexCorruptHoleGZAESTest \
, RecoverCorruptHeaderGZMultiTest
, RecoverCorruptHeaderGZAESSingleTest
, RecoverCorruptHeaderGZAESMultiTest
+ , RecoverCorruptTruncateTest
+ , RecoverCorruptTruncateGZTest
+ , RecoverCorruptTruncateGZAESTest
, RescueCorruptHeaderCTSizeGZAESTest
, RecoverCorruptEntireHeaderSingleTest
, RecoverCorruptEntireHeaderMultiTest
, RecoverCorruptHoleTest
, RecoverCorruptHoleGZTest
, RecoverCorruptHoleGZAESTest
+ , RescueCorruptTruncateTest
+ , RescueCorruptTruncateGZTest
+ , RescueCorruptTruncateGZAESTest
, RescueCorruptHoleTest
, RescueCorruptHoleGZTest
, RescueCorruptHoleGZAESTest
, GenIndexIntactMultiTest
, GenIndexIntactMultiGZTest
, GenIndexIntactMultiGZAESTest
+ , GenIndexCorruptTruncateTest
+ , GenIndexCorruptTruncateGZTest
+ , GenIndexCorruptTruncateGZAESTest
, GenIndexCorruptHoleTest
, GenIndexCorruptHoleGZTest
, GenIndexCorruptHoleGZAESTest
compressed data, the two byte magic is altered, for uncompressed
archives, the tar header checksum field.
+ - corrupt_truncate ():
+ Drop the file’s content after two thirds, causing extraction of later
+ objects to fail. Since the operation preserves the offsets of objects
+ before the cutoff, this yields the same results regardless of whether
+ restore or rescue mode is used.
+
- corrupt_ctsize ():
Modify the *ctsize* field of a PDTCRYPT header. The goal is to have
decryption continue past the end of the object, causing data
flip_bits (fname, 100 + 8 + 8 + 8 + 12 + 12 + 1)
+def corrupt_truncate (_, fname, _compress, _encrypt):
+ """
+ Shorten file by one third.
+ """
+ fd = os.open (fname, os.O_WRONLY)
+ size = os.lseek (fd, 0, os.SEEK_END)
+ os.ftruncate (fd, 2 * size // 3)
+ os.fsync (fd)
+ os.close (fd)
+
+
def corrupt_ctsize (_, fname, compress, encrypt):
"""
Blow up the size of an object so as to cause its apparent payload to leak
VOLUMES = 3
+class RecoverCorruptTruncateTestBase (RecoverTest):
+ COMPRESSION = None
+ PASSWORD = None
+ FAILURES = 0
+ CORRUPT = corrupt_truncate
+ MISMATCHES = 0
+
+class RecoverCorruptTruncateTest (RecoverCorruptTruncateTestBase):
+ pass
+
+class RecoverCorruptTruncateGZTest (RecoverCorruptTruncateTestBase):
+ """Two files that failed missing."""
+ COMPRESSION = "#gz"
+ FAILURES = 2
+
+class RecoverCorruptTruncateGZAESTest (RecoverCorruptTruncateTestBase):
+ """Two files that failed missing."""
+ COMPRESSION = "#gz"
+ PASSWORD = TEST_PASSWORD
+ FAILURES = 2
+
+
class RecoverCorruptEntireHeaderTestBase (RecoverTest):
COMPRESSION = None
PASSWORD = None
# rescue
###############################################################################
+class RescueCorruptTruncateTestBase (RescueTest):
+ COMPRESSION = None
+ PASSWORD = None
+ FAILURES = 0
+ CORRUPT = corrupt_truncate
+ MISMATCHES = 0
+
+class RescueCorruptTruncateTest (RescueCorruptTruncateTestBase):
+ pass
+
+class RescueCorruptTruncateGZTest (RescueCorruptTruncateTestBase):
+ """Two files that failed missing."""
+ COMPRESSION = "#gz"
+ MISSING = 2
+
+class RescueCorruptTruncateGZAESTest (RescueCorruptTruncateTestBase):
+ """Two files missing but didn’t fail on account of their absence."""
+ COMPRESSION = "#gz"
+ PASSWORD = TEST_PASSWORD
+ MISSING = 2
+
+
@unittest.skipIf(sys.version_info < (3, 4), "requires recent os library")
class RescueCorruptHoleBaseTest (RescueTest):
"""
MISSING = 2
+class GenIndexCorruptTruncateBaseTest (GenIndexTest):
+ """
+ Recreate index from file that lacks the latter portion.
+ """
+ COMPRESSION = None
+ PASSWORD = None
+ FAILURES = 0
+ CORRUPT = corrupt_truncate
+ MISSING = 2
+
+class GenIndexCorruptTruncateTest (GenIndexCorruptTruncateBaseTest):
+ pass
+
+class GenIndexCorruptTruncateGZTest (GenIndexCorruptTruncateBaseTest):
+ COMPRESSION = "#gz"
+
+class GenIndexCorruptTruncateGZAESTest (GenIndexCorruptTruncateBaseTest):
+ COMPRESSION = "#gz"
+ PASSWORD = TEST_PASSWORD
+
+
class GenIndexCorruptHoleBaseTest (GenIndexTest):
"""
Recreate index from file with hole.
MISSING = 2
-
class GenIndexCorruptEntireHeaderBaseTest (GenIndexTest):
"""
Recreate index from file with hole.