diff options
Diffstat (limited to 'lisp/arc-mode.el')
-rw-r--r-- | lisp/arc-mode.el | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el index ae85fc55add..c998a8a1f1a 100644 --- a/lisp/arc-mode.el +++ b/lisp/arc-mode.el @@ -1920,10 +1920,10 @@ This doesn't recover lost files, it just undoes changes in the buffer itself." (search-backward-regexp "[P]K\005\006") (let ((p (archive-l-e (+ (point) 16) 4)) files) - (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") @@ -1949,6 +1949,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 |