From 97383e9e6051dd174b588a18e67aff65acc7b5b6 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Thu, 28 Jul 2016 22:23:38 +0200 Subject: [PATCH] transform unpacker exception only at 1 place --- borg/archive.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/borg/archive.py b/borg/archive.py index 854544779..653e2dd1c 100644 --- a/borg/archive.py +++ b/borg/archive.py @@ -779,6 +779,14 @@ class RobustUnpacker: return self def __next__(self): + def unpack_next(): + try: + return next(self._unpacker) + except (TypeError, ValueError) as err: + # transform exceptions that might be raised when feeding + # msgpack with invalid data to a more specific exception + raise self.UnpackerCrashed(str(err)) + if self._resync: data = b''.join(self._buffered_data) while self._resync: @@ -791,10 +799,9 @@ class RobustUnpacker: self._unpacker = msgpack.Unpacker(object_hook=StableDict) self._unpacker.feed(data) try: - item = next(self._unpacker) - except (TypeError, ValueError, StopIteration): - # Ignore exceptions that might be raised when feeding - # msgpack with invalid data + item = unpack_next() + except (self.UnpackerCrashed, StopIteration): + # as long as we are resyncing, we also ignore StopIteration pass else: if self.validator(item): @@ -802,10 +809,7 @@ class RobustUnpacker: return item data = data[1:] else: - try: - return next(self._unpacker) - except (TypeError, ValueError) as err: - raise self.UnpackerCrashed(str(err)) + return unpack_next() class ArchiveChecker: