From: Philipp Gesang Date: Fri, 25 Aug 2017 15:03:37 +0000 (+0200) Subject: prevent tarobject iteration in disaster mode X-Git-Tag: v2.2~7^2~45 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=c52fd26b17cf2018b847ec05c8882b6a13847480;p=python-delta-tar prevent tarobject iteration in disaster mode 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. --- diff --git a/deltatar/deltatar.py b/deltatar/deltatar.py index f51cee7..f5c39f0 100644 --- a/deltatar/deltatar.py +++ b/deltatar/deltatar.py @@ -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']: