From 8721d5aa233ae6004e74308541e425f300d1ec4f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 31 Jul 2011 15:16:40 -0600 Subject: [PATCH] Fix decoding of trailing data entries --- src/calibre/ebooks/mobi/debug.py | 2 +- src/calibre/ebooks/mobi/utils.py | 29 ++++++++++++++++++----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/calibre/ebooks/mobi/debug.py b/src/calibre/ebooks/mobi/debug.py index 91fc3d5e0f..8d2f3ba41e 100644 --- a/src/calibre/ebooks/mobi/debug.py +++ b/src/calibre/ebooks/mobi/debug.py @@ -1377,7 +1377,7 @@ class MOBIFile(object): # {{{ self.index_header, self.cncx) self.indexing_record_nums = set(xrange(pir, pir+2+self.index_header.num_of_cncx_blocks)) - self.secondary_index_record = self.secondary_index_record = None + self.secondary_index_record = self.secondary_index_header = None sir = self.mobi_header.secondary_index_record if sir != 0xffffffff: self.secondary_index_header = SecondaryIndexHeader(self.records[sir]) diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py index 4298276bc1..e16871fec4 100644 --- a/src/calibre/ebooks/mobi/utils.py +++ b/src/calibre/ebooks/mobi/utils.py @@ -169,19 +169,26 @@ def get_trailing_data(record, extra_data_flags): :return: Trailing data, record - trailing data ''' data = OrderedDict() - for i in xrange(16, -1, -1): - flag = 1 << i # 2**i - if flag & extra_data_flags: - if i == 0: - # Only the first two bits are used for the size since there can - # never be more than 3 trailing multibyte chars - sz = (ord(record[-1]) & 0b11) + 1 - consumed = 1 - else: - sz, consumed = decint(record, forward=False) + flags = extra_data_flags >> 1 + + num = 0 + while flags: + num += 1 + if flags & 0b1: + sz, consumed = decint(record, forward=False) if sz > consumed: - data[i] = record[-sz:-consumed] + data[num] = record[-sz:-consumed] record = record[:-sz] + flags >>= 1 + # Read multibyte chars if any + if extra_data_flags & 0b1: + # Only the first two bits are used for the size since there can + # never be more than 3 trailing multibyte chars + sz = (ord(record[-1]) & 0b11) + 1 + consumed = 1 + if sz > consumed: + data[0] = record[-sz:-consumed] + record = record[:-sz] return data, record def encode_trailing_data(raw):