zip 2.0.0 → 2.0.1
raw patch · 9 files changed
+86/−83 lines, 9 filessetup-changed
Files
- CHANGELOG.md +5/−0
- Codec/Archive/Zip.hs +9/−9
- Codec/Archive/Zip/CP437.hs +2/−2
- Codec/Archive/Zip/Internal.hs +23/−17
- Codec/Archive/Zip/Type.hs +8/−8
- README.md +3/−5
- Setup.hs +0/−6
- tests/Main.hs +12/−12
- zip.cabal +24/−24
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 @@ [](http://stackage.org/lts/package/zip)  -* [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