From c1e1d6e9dd188b6e7cf11dd36d8dd049ce8ef659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Borgstr=C3=B6m?= Date: Mon, 24 Feb 2014 12:59:38 +0100 Subject: [PATCH] repository: Fixed a potential infinite loop in recover_segment --- attic/repository.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/attic/repository.py b/attic/repository.py index 77c3d9165..06aa150cf 100644 --- a/attic/repository.py +++ b/attic/repository.py @@ -258,6 +258,8 @@ class Repository(object): current_index = None if transaction_id is None: transaction_id = self.get_index_transaction_id() + if transaction_id is None: + transaction_id = self.io.get_latest_segment() segments_transaction_id = self.io.get_segments_transaction_id() self.get_index(None) for segment, filename in self.io.segment_iterator(): @@ -417,6 +419,12 @@ class LoggedIO(object): for filename in filenames: yield int(filename), os.path.join(dirpath, filename) + + def get_latest_segment(self): + for segment, filename in self.segment_iterator(reverse=True): + return segment + return None + def get_segments_transaction_id(self): """Verify that the transaction id is consistent with the index transaction id """ @@ -518,7 +526,7 @@ class LoggedIO(object): fd.write(MAGIC) while len(data) >= self.header_fmt.size: crc, size, tag = self.header_fmt.unpack(data[:self.header_fmt.size]) - if size > len(data): + if size < self.header_fmt.size or size > len(data): data = data[1:] continue if crc32(data[4:size]) & 0xffffffff != crc: