From 044585c670c18fce7ea29ed234f96c24494148e4 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 11 Aug 2017 11:50:55 +0200 Subject: [PATCH] catch incomplete trailing header in tolerant recovery This makes decryption in recovery mode resistant against malformed trailing data which would otherwise error out for the entire buffered chunk on account of a decryption failure. --- deltatar/deltatar.py | 5 +++-- deltatar/tarfile.py | 16 +++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/deltatar/deltatar.py b/deltatar/deltatar.py index 1b15a0a..9a96467 100644 --- a/deltatar/deltatar.py +++ b/deltatar/deltatar.py @@ -1382,7 +1382,7 @@ class DeltaTar(object): helper = RestoreHelper(self, cwd, backup_path=backup_tar_path, tarobj=index_it.tar_obj) elif mode == "diff": - helper = RestoreHelper(self, cwd, backup_indexes_paths) + helper = RestoreHelper(self, cwd, backup_indexes_paths, disaster=disaster) # get iterator from newest index at _data[0] index_it = self.iterate_index_path(helper._data[0]["path"]) @@ -1861,7 +1861,8 @@ class RestoreHelper(object): concat='#' in self._deltatar.mode, encryption=index_data["decryptor"], new_volume_handler=index_data['new_volume_handler'], - save_to_members=False) + save_to_members=False, + tolerant=self._disaster) member = index_data['tarobj'].__iter__().__next__() diff --git a/deltatar/tarfile.py b/deltatar/tarfile.py index 49678cc..2629e44 100644 --- a/deltatar/tarfile.py +++ b/deltatar/tarfile.py @@ -1017,9 +1017,15 @@ class _Stream: if self.arcmode & ARCMODE_ENCRYPT: if self.remainder <= 0: # prepare next object - if self._init_read_encrypt () is False: # EOF - buf = None - break # while + try: + if self._init_read_encrypt () is False: # EOF + buf = None + break # while + except DecryptionError: + if self.tolerant: + self.buf = b"".join (t [good_crypto:]) + return b"".join (t [:good_crypto]) + raise # only read up to the end of the encrypted object todo = min (size, self.remainder) @@ -2072,7 +2078,7 @@ class TarFile(object): @classmethod def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, - encryption=None, compresslevel=9, **kwargs): + encryption=None, compresslevel=9, tolerant=False, **kwargs): """Open a tar archive for reading, writing or appending. Return an appropriate TarFile class. @@ -2169,7 +2175,7 @@ class TarFile(object): stream = _Stream(name, filemode, comptype, fileobj, bufsize, concat=True, encryption=encryption, - compresslevel=compresslevel) + compresslevel=compresslevel, tolerant=tolerant) kwargs ["concat"] = True try: t = cls(name, filemode, stream, **kwargs) -- 1.7.1