prevent tarobject iteration in disaster mode
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Fri, 25 Aug 2017 15:03:37 +0000 (17:03 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
The tarfile iterator relies on the header data to determine the
next object offset which may be wrong for corrupt files. Instead,
skip that iteration step and completely rely on the object
offsets determined during index rebuild.

deltatar/deltatar.py

index f51cee7..f5c39f0 100644 (file)
@@ -1933,17 +1933,23 @@ class RestoreHelper(object):
             # seek tarfile if needed
             offset = file_data.get('offset', -1)
             if index_data['tarobj']:
-                try:
-                    member = index_data['tarobj'].__iter__().__next__()
-                except tarfile.DecryptionError:
-                    pass
-                except tarfile.CompressionError:
-                    pass
-
-                if not member or member.path != file_data['path']:
+                if self._disaster == tarfile.TOLERANCE_RESCUE:
                     # force a seek and reopen
                     index_data['tarobj'].close()
                     index_data['tarobj'] = None
+                else:
+                    try:
+                        member = index_data['tarobj'].__iter__().__next__()
+                    except tarfile.DecryptionError:
+                        pass
+                    except tarfile.CompressionError:
+                        pass
+
+                    if not member or member.path != file_data['path']:
+                        # force a seek and reopen
+                        index_data['tarobj'].close()
+                        index_data['tarobj'] = None
+
 
             # open the tarfile if needed
             if not index_data['tarobj']: