mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix decoding of trailing data entries
This commit is contained in:
parent
cf3184d8cd
commit
8721d5aa23
@ -1377,7 +1377,7 @@ class MOBIFile(object): # {{{
|
|||||||
self.index_header, self.cncx)
|
self.index_header, self.cncx)
|
||||||
self.indexing_record_nums = set(xrange(pir,
|
self.indexing_record_nums = set(xrange(pir,
|
||||||
pir+2+self.index_header.num_of_cncx_blocks))
|
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
|
sir = self.mobi_header.secondary_index_record
|
||||||
if sir != 0xffffffff:
|
if sir != 0xffffffff:
|
||||||
self.secondary_index_header = SecondaryIndexHeader(self.records[sir])
|
self.secondary_index_header = SecondaryIndexHeader(self.records[sir])
|
||||||
|
@ -169,19 +169,26 @@ def get_trailing_data(record, extra_data_flags):
|
|||||||
:return: Trailing data, record - trailing data
|
:return: Trailing data, record - trailing data
|
||||||
'''
|
'''
|
||||||
data = OrderedDict()
|
data = OrderedDict()
|
||||||
for i in xrange(16, -1, -1):
|
flags = extra_data_flags >> 1
|
||||||
flag = 1 << i # 2**i
|
|
||||||
if flag & extra_data_flags:
|
num = 0
|
||||||
if i == 0:
|
while flags:
|
||||||
# Only the first two bits are used for the size since there can
|
num += 1
|
||||||
# never be more than 3 trailing multibyte chars
|
if flags & 0b1:
|
||||||
sz = (ord(record[-1]) & 0b11) + 1
|
sz, consumed = decint(record, forward=False)
|
||||||
consumed = 1
|
|
||||||
else:
|
|
||||||
sz, consumed = decint(record, forward=False)
|
|
||||||
if sz > consumed:
|
if sz > consumed:
|
||||||
data[i] = record[-sz:-consumed]
|
data[num] = record[-sz:-consumed]
|
||||||
record = record[:-sz]
|
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
|
return data, record
|
||||||
|
|
||||||
def encode_trailing_data(raw):
|
def encode_trailing_data(raw):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user