From c52fd26b17cf2018b847ec05c8882b6a13847480 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 25 Aug 2017 17:03:37 +0200 Subject: [PATCH] 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. --- deltatar/deltatar.py | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) 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']: -- 1.7.1