From edea587f3586974dfd50fa56899d7afef6c50375 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Thu, 28 Jul 2016 22:10:29 +0200 Subject: [PATCH] catch unpacker exceptions, resync, fixes #1351 --- borg/archive.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/borg/archive.py b/borg/archive.py index 9964f5f27..ac7d77565 100644 --- a/borg/archive.py +++ b/borg/archive.py @@ -754,6 +754,9 @@ def valid_msgpacked_dict(d, keys_serialized): class RobustUnpacker: """A restartable/robust version of the streaming msgpack unpacker """ + class UnpackerCrashed(Exception): + """raise if unpacker crashed""" + def __init__(self, validator, item_keys): super().__init__() self.item_keys = [msgpack.packb(name) for name in item_keys] @@ -798,7 +801,10 @@ class RobustUnpacker: pass data = data[1:] else: - return next(self._unpacker) + try: + return next(self._unpacker) + except (TypeError, ValueError) as err: + raise self.UnpackerCrashed(str(err)) class ArchiveChecker: @@ -1017,6 +1023,9 @@ class ArchiveChecker: yield item else: report('Did not get expected metadata dict when unpacking item metadata', chunk_id, i) + except RobustUnpacker.UnpackerCrashed as err: + report('Unpacker crashed while unpacking item metadata, trying to resync...', chunk_id, i) + unpacker.resync() except Exception: report('Exception while unpacking item metadata', chunk_id, i) raise