浏览代码

transform unpacker exception only at 1 place

Thomas Waldmann 9 年之前
父节点
当前提交
97383e9e60
共有 1 个文件被更改,包括 12 次插入8 次删除
  1. 12 8
      borg/archive.py

+ 12 - 8
borg/archive.py

@@ -779,6 +779,14 @@ class RobustUnpacker:
         return self
         return self
 
 
     def __next__(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:
         if self._resync:
             data = b''.join(self._buffered_data)
             data = b''.join(self._buffered_data)
             while self._resync:
             while self._resync:
@@ -791,10 +799,9 @@ class RobustUnpacker:
                 self._unpacker = msgpack.Unpacker(object_hook=StableDict)
                 self._unpacker = msgpack.Unpacker(object_hook=StableDict)
                 self._unpacker.feed(data)
                 self._unpacker.feed(data)
                 try:
                 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
                     pass
                 else:
                 else:
                     if self.validator(item):
                     if self.validator(item):
@@ -802,10 +809,7 @@ class RobustUnpacker:
                         return item
                         return item
                 data = data[1:]
                 data = data[1:]
         else:
         else:
-            try:
-                return next(self._unpacker)
-            except (TypeError, ValueError) as err:
-                raise self.UnpackerCrashed(str(err))
+            return unpack_next()
 
 
 
 
 class ArchiveChecker:
 class ArchiveChecker: