From e72e7e1773dcb0a8233c5c2918fe7b4056bacd92 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 12 Dec 2019 23:14:58 +0530 Subject: [PATCH] Fix reading of names in custom zipfile module on py3 --- src/calibre/utils/zipfile.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index 34172cf0b0..294ac11331 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -400,12 +400,6 @@ class ZipInfo (object): else: return self.filename, self.flag_bits - def _decodeFilename(self): - if self.flag_bits & 0x800: - return self.filename.decode('utf-8') - else: - return decode_arcname(self.filename) - def _decodeExtra(self): # Try to decode the extra field. extra = self.extra @@ -847,6 +841,13 @@ class ZipFile: if self.debug > 2: print(centdir) filename = fp.read(centdir[_CD_FILENAME_LENGTH]) + flags = centdir[5] + if flags & 0x800: + # UTF-8 file names extension + filename = filename.decode('utf-8') + else: + # Historical ZIP filename encoding + filename = filename.decode('cp437') # Create ZipInfo instance to store file information x = ZipInfo(filename) x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) @@ -863,7 +864,6 @@ class ZipFile: x._decodeExtra() x.header_offset = x.header_offset + concat - x.filename = x._decodeFilename() self.filelist.append(x) self.NameToInfo[x.filename] = x