From c6226e2a750e69c0cf52fa46bcab8912ff2ca284 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 8 Aug 2017 10:48:31 +0200 Subject: [PATCH] force tarfile reopen after bad read in deltatar Closing the tarfile after an unreadable object was encountered causes the stream to be reopened for the next read. Otherwise, the corrupt object is already buffered and tarfile would continue to seek inside the bad data. --- deltatar/deltatar.py | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/deltatar/deltatar.py b/deltatar/deltatar.py index 2d48c39..b2d483f 100644 --- a/deltatar/deltatar.py +++ b/deltatar/deltatar.py @@ -1806,7 +1806,14 @@ class RestoreHelper(object): # seek tarfile if needed offset = file_data.get('offset', -1) if index_data['tarobj']: - member = index_data['tarobj'].__iter__().__next__() + try: + member = index_data['tarobj'].__iter__().__next__() + except tarfile.ReadError as exn: + # Possibly corrupted archive; may still be recoverable + # if offsets did not change. + index_data['tarobj'].close() + index_data['tarobj'] = None + raise if not member or member.path != file_data['path']: # force a seek and reopen index_data['tarobj'].close() -- 1.7.1