Fix support for Zip64 zip files

* lisp/arc-mode.el (archive-zip-summarize): Fix detection of Zip64
central directory.  Support 64-bit file size field used by Zip64.
(Bug#43597)
This commit is contained in:
Eli Zaretskii 2020-09-25 17:11:11 +03:00
parent ba635a19fb
commit f31c6792ab

View file

@ -1799,10 +1799,10 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
files
visual
emacs-int-has-32bits)
(when (= p -1)
;; If the offset of end-of-central-directory is -1, this is a
;; Zip64 extended ZIP file format, and we need to glean the info
;; from Zip64 records instead.
(when (or (= p #xffffffff) (= p -1))
;; If the offset of end-of-central-directory is 0xFFFFFFFF, this
;; is a Zip64 extended ZIP file format, and we need to glean the
;; info from Zip64 records instead.
;;
;; First, find the Zip64 end-of-central-directory locator.
(search-backward "PK\006\007")
@ -1828,6 +1828,15 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
(efnname (let ((str (buffer-substring (+ p 46) (+ p 46 fnlen))))
(decode-coding-string
str archive-file-name-coding-system)))
(ucsize (if (and (or (= ucsize #xffffffff) (= ucsize -1))
(> exlen 0))
;; APPNOTE.TXT, para 4.5.3: the Extra Field
;; begins with 2 bytes of signature
;; (\000\001), followed by 2 bytes that give
;; the size of the extra block, followed by
;; an 8-byte uncompressed size.
(archive-l-e (+ p 46 fnlen 4) 8)
ucsize))
(isdir (and (= ucsize 0)
(string= (file-name-nondirectory efnname) "")))
(mode (cond ((memq creator '(2 3)) ; Unix