diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index 1bf754288d..95e556418c 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -1097,18 +1097,26 @@ class ZipFile: and len(os.path.splitdrive(targetpath)[1]) > 1): targetpath = targetpath[:-1] - # don't include leading "/" from file name if present - if member.filename[0] == '/': - targetpath = os.path.join(targetpath, member.filename[1:]) - else: - targetpath = os.path.join(targetpath, member.filename) + base_target = targetpath # Added by Kovid - targetpath = os.path.normpath(targetpath) + # don't include leading "/" from file name if present + fname = member.filename + if fname.startswith('/'): + fname = fname[1:] + + targetpath = os.path.normpath(os.path.join(base_target, fname)) # Create all upper directories if necessary. upperdirs = os.path.dirname(targetpath) if upperdirs and not os.path.exists(upperdirs): - os.makedirs(upperdirs) + try: + os.makedirs(upperdirs) + except: # Added by Kovid + targetpath = os.path.join(base_target, + sanitize_file_name2(fname)) + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + os.makedirs(upperdirs) if member.filename[-1] == '/': if not os.path.isdir(targetpath):