packages feed

zip 2.0.0 → 2.0.1

raw patch · 9 files changed

+86/−83 lines, 9 filessetup-changed

Files

CHANGELOG.md view
@@ -1,3 +1,8 @@+## Zip 2.0.1++* Fixed corruption of large entries when zip64 is used. [Issue+  111](https://github.com/mrkkrp/zip/issues/111).+ ## Zip 2.0.0  * Unified `BZip2Unsupported` and `ZstdUnsupported` into a single data
Codec/Archive/Zip.hs view
@@ -146,7 +146,7 @@   ) where -import qualified Codec.Archive.Zip.Internal as I+import Codec.Archive.Zip.Internal qualified as I import Codec.Archive.Zip.Type import Conduit (PrimMonad) import Control.Monad@@ -157,22 +157,22 @@ import Control.Monad.Trans.Resource (MonadResource, ResourceT) import Data.ByteString (ByteString) import Data.Conduit (ConduitT, (.|))-import qualified Data.Conduit as C-import qualified Data.Conduit.Binary as CB-import qualified Data.Conduit.List as CL-import qualified Data.DList as DList+import Data.Conduit qualified as C+import Data.Conduit.Binary qualified as CB+import Data.Conduit.List qualified as CL+import Data.DList qualified as DList import Data.Map.Strict (Map, (!))-import qualified Data.Map.Strict as M+import Data.Map.Strict qualified as M import Data.Sequence (Seq, (|>))-import qualified Data.Sequence as S-import qualified Data.Set as E+import Data.Sequence qualified as S+import Data.Set qualified as E import Data.Text (Text) import Data.Time.Clock (UTCTime) import Data.Void import Data.Word (Word16, Word32) import System.Directory import System.FilePath ((</>))-import qualified System.FilePath as FP+import System.FilePath qualified as FP import System.IO.Error (isDoesNotExistError)  #ifndef mingw32_HOST_OS
Codec/Archive/Zip/CP437.hs view
@@ -15,10 +15,10 @@  import Control.Arrow (first) import Data.ByteString (ByteString)-import qualified Data.ByteString as B+import Data.ByteString qualified as B import Data.Char import Data.Text (Text)-import qualified Data.Text as T+import Data.Text qualified as T import Data.Word (Word8)  -- | Decode a 'ByteString' containing CP 437 encoded text.
Codec/Archive/Zip/Internal.hs view
@@ -35,26 +35,26 @@ import Data.Bits import Data.Bool (bool) import Data.ByteString (ByteString)-import qualified Data.ByteString as B+import Data.ByteString qualified as B import Data.Char (ord) import Data.Conduit (ConduitT, ZipSink (..), (.|))-import qualified Data.Conduit as C-import qualified Data.Conduit.Binary as CB-import qualified Data.Conduit.List as CL-import qualified Data.Conduit.Zlib as Z+import Data.Conduit qualified as C+import Data.Conduit.Binary qualified as CB+import Data.Conduit.List qualified as CL+import Data.Conduit.Zlib qualified as Z import Data.Digest.CRC32 (crc32Update) import Data.Fixed (Fixed (..)) import Data.Foldable (foldl') import Data.Map.Strict (Map, (!))-import qualified Data.Map.Strict as M+import Data.Map.Strict qualified as M import Data.Maybe (catMaybes, fromJust, isNothing) import Data.Sequence (Seq, (><), (|>))-import qualified Data.Sequence as S+import Data.Sequence qualified as S import Data.Serialize-import qualified Data.Set as E+import Data.Set qualified as E import Data.Text (Text)-import qualified Data.Text as T-import qualified Data.Text.Encoding as T+import Data.Text qualified as T+import Data.Text.Encoding qualified as T import Data.Time import Data.Version import Data.Void@@ -779,11 +779,16 @@   -- | Resulting representation   ByteString makeZip64ExtraField headerType Zip64ExtraField {..} = runPut $ do-  when (headerType == LocalHeader || z64efUncompressedSize >= ffffffff) $-    putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size-  when (headerType == LocalHeader || z64efCompressedSize >= ffffffff) $-    putWord64le (fromIntegral z64efCompressedSize) -- compressed size-  when (headerType == CentralDirHeader && z64efOffset >= ffffffff) $+  case headerType of+    LocalHeader -> do+      putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size+      putWord64le (fromIntegral z64efCompressedSize) -- compressed size+    CentralDirHeader -> do+      when (z64efUncompressedSize >= ffffffff) $+        putWord64le (fromIntegral z64efUncompressedSize) -- uncompressed size+      when (z64efCompressedSize >= ffffffff) $+        putWord64le (fromIntegral z64efCompressedSize) -- compressed size+  when (z64efOffset >= ffffffff) $     putWord64le (fromIntegral z64efOffset) -- offset of local file header  -- | Create 'ByteString' representing an extra field.@@ -810,7 +815,8 @@   EntryDescription ->   Put putHeader headerType s entry@EntryDescription {..} = do-  let isCentralDirHeader = headerType == CentralDirHeader+  let isLocalHeader = headerType == LocalHeader+      isCentralDirHeader = headerType == CentralDirHeader   putWord32le (bool 0x04034b50 0x02014b50 isCentralDirHeader)   -- ↑ local/central file header signature   when isCentralDirHeader $@@ -842,7 +848,7 @@             }       extraField =         B.take 0xffff . runPut . putExtraField $-          if needsZip64 entry+          if needsZip64 entry || isLocalHeader             then M.insert 1 zip64ef edExtraField             else edExtraField   putWord16le (fromIntegral $ B.length extraField) -- extra field length
Codec/Archive/Zip/Type.hs view
@@ -34,25 +34,25 @@ import Control.Exception (Exception) import Control.Monad.Catch (MonadThrow (..)) import Data.ByteString (ByteString)-import qualified Data.ByteString as B+import Data.ByteString qualified as B import Data.CaseInsensitive (CI)-import qualified Data.CaseInsensitive as CI+import Data.CaseInsensitive qualified as CI import Data.Data (Data) import Data.List.NonEmpty (NonEmpty)-import qualified Data.List.NonEmpty as NE+import Data.List.NonEmpty qualified as NE import Data.Map (Map) import Data.Maybe (mapMaybe) import Data.Text (Text)-import qualified Data.Text as T-import qualified Data.Text.Encoding as T+import Data.Text qualified as T+import Data.Text.Encoding qualified as T import Data.Time.Clock (UTCTime) import Data.Typeable (Typeable) import Data.Version (Version) import Data.Word (Word16, Word32) import Numeric.Natural-import qualified System.FilePath as FP-import qualified System.FilePath.Posix as Posix-import qualified System.FilePath.Windows as Windows+import System.FilePath qualified as FP+import System.FilePath.Posix qualified as Posix+import System.FilePath.Windows qualified as Windows  ---------------------------------------------------------------------------- -- Entry selector
README.md view
@@ -6,7 +6,7 @@ [![Stackage LTS](http://stackage.org/package/zip/badge/lts)](http://stackage.org/lts/package/zip) ![CI](https://github.com/mrkkrp/zip/workflows/CI/badge.svg?branch=master) -* [Why this library is written](#why-this-library-is-written)+* [Why this library was written](#why-this-library-was-written)     * [zip-archive](#zip-archive)     * [LibZip](#libzip)     * [zip-conduit](#zip-conduit)@@ -22,13 +22,11 @@ * [License](#license)  This is a feature-rich, memory-efficient, and type-safe library to-manipulate Zip archives. The library is the most complete and efficient-implementation of the .ZIP specification in Haskell (at least from the-open-sourced ones). In particular, it's created with large multimedia data+manipulate Zip archives. The library was created with large multimedia data in mind and provides all features users might expect, comparable in terms of feature-set with libraries like `libzip` in C. -## Why this library is written+## Why this library was written  There are a few libraries to work with Zip archives, yet every one of them provides only a subset of useful functionality or otherwise is flawed in
− Setup.hs
@@ -1,6 +0,0 @@-module Main (main) where--import Distribution.Simple--main :: IO ()-main = defaultMain
tests/Main.hs view
@@ -13,26 +13,26 @@ import Control.Monad.IO.Class import Data.Bits import Data.ByteString (ByteString)-import qualified Data.ByteString as B-import qualified Data.ByteString.Builder as LB-import qualified Data.ByteString.Lazy as LB-import qualified Data.Conduit as C-import qualified Data.Conduit.List as CL-import qualified Data.DList as DList+import Data.ByteString qualified as B+import Data.ByteString.Builder qualified as LB+import Data.ByteString.Lazy qualified as LB+import Data.Conduit qualified as C+import Data.Conduit.List qualified as CL+import Data.DList qualified as DList import Data.List (intercalate) import Data.Map (Map, (!))-import qualified Data.Map.Strict as M+import Data.Map.Strict qualified as M import Data.Maybe (fromJust)-import qualified Data.Set as E+import Data.Set qualified as E import Data.Text (Text)-import qualified Data.Text as T-import qualified Data.Text.Encoding as T+import Data.Text qualified as T+import Data.Text.Encoding qualified as T import Data.Time import Data.Version import Data.Word import System.Directory import System.FilePath ((</>))-import qualified System.FilePath as FP+import System.FilePath qualified as FP import System.IO import System.IO.Error (isDoesNotExistError) import System.IO.Temp@@ -462,7 +462,7 @@     it "does not pass the check" $ \path ->       property $ \b s ->         not (B.null b) ==> do-          let headerLength = 30 + (B.length . T.encodeUtf8 . getEntryName $ s)+          let headerLength = 50 + (B.length . T.encodeUtf8 . getEntryName $ s)           localFileHeaderOffset <- createArchive path $ do             addEntry Store b s             commit
zip.cabal view
@@ -1,11 +1,11 @@ cabal-version:   2.4 name:            zip-version:         2.0.0+version:         2.0.1 license:         BSD-3-Clause license-file:    LICENSE.md maintainer:      Mark Karpov <markkarpov92@gmail.com> author:          Mark Karpov <markkarpov92@gmail.com>-tested-with:     ghc ==9.0.1 ghc ==9.2.5 ghc ==9.4.4+tested-with:     ghc ==9.4.7 ghc ==9.6.3 ghc ==9.8.1 homepage:        https://github.com/mrkkrp/zip bug-reports:     https://github.com/mrkkrp/zip/issues synopsis:        Operations on zip archives@@ -49,10 +49,10 @@         Codec.Archive.Zip.Internal         Codec.Archive.Zip.Type -    default-language: Haskell2010+    default-language: GHC2021     build-depends:-        base >=4.15 && <5.0,-        bytestring >=0.9 && <0.12,+        base >=4.15 && <5,+        bytestring >=0.9 && <0.13,         case-insensitive >=1.2.0.2 && <1.3,         cereal >=0.3 && <0.6,         conduit >=1.3 && <1.4,@@ -64,11 +64,11 @@         exceptions >=0.6 && <0.11,         filepath >=1.2 && <1.5,         monad-control >=1.0 && <1.1,-        mtl >=2.0 && <3.0,+        mtl >=2 && <3,         resourcet >=1.2 && <1.4,-        text >=0.2 && <2.1,+        text >=0.2 && <2.2,         time >=1.4 && <1.13,-        transformers >=0.4 && <0.6,+        transformers >=0.4 && <0.7,         transformers-base      if !flag(disable-bzip2)@@ -80,8 +80,8 @@     if flag(dev)         cpp-options: -DHASKELL_ZIP_DEV_MODE         ghc-options:-            -O0 -Wall -Werror -Wcompat -Wincomplete-record-updates-            -Wincomplete-uni-patterns -Wnoncanonical-monad-instances+            -Wall -Werror -Wredundant-constraints -Wpartial-fields+            -Wunused-packages      else         ghc-options: -O2 -Wall@@ -102,16 +102,16 @@ executable haskell-zip-app     main-is:          Main.hs     hs-source-dirs:   bench-app-    default-language: Haskell2010+    default-language: GHC2021     build-depends:-        base >=4.15 && <5.0,+        base >=4.15 && <5,         filepath >=1.2 && <1.5,         zip      if flag(dev)         ghc-options:-            -Wall -Werror -Wcompat -Wincomplete-record-updates-            -Wincomplete-uni-patterns -Wnoncanonical-monad-instances+            -Wall -Werror -Wredundant-constraints -Wpartial-fields+            -Wunused-packages      else         ghc-options: -O2 -Wall@@ -120,26 +120,26 @@     type:             exitcode-stdio-1.0     main-is:          Main.hs     hs-source-dirs:   tests-    default-language: Haskell2010+    default-language: GHC2021     build-depends:-        base >=4.15 && <5.0,-        QuickCheck >=2.4 && <3.0,-        bytestring >=0.9 && <0.12,+        base >=4.15 && <5,+        QuickCheck >=2.4 && <3,+        bytestring >=0.9 && <0.13,         conduit >=1.3 && <1.4,         containers >=0.5 && <0.7,         directory >=1.2.2 && <1.4,-        dlist >=0.8 && <2.0,-        exceptions >=0.6 && <0.11,+        dlist >=0.8 && <2,         filepath >=1.2 && <1.5,-        hspec >=2.0 && <3.0,+        hspec >=2 && <3,         temporary >=1.1 && <1.4,-        text >=0.2 && <2.1,+        text >=0.2 && <2.2,         time >=1.4 && <1.13,-        transformers >=0.4 && <0.6,         zip      if flag(dev)-        ghc-options: -O0 -Wall -Werror+        ghc-options:+            -Wall -Werror -Wredundant-constraints -Wpartial-fields+            -Wunused-packages      else         ghc-options: -O2 -Wall