diff --git a/src/packer.cpp b/src/packer.cpp index 85b28b24..c5e2f8fb 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -684,7 +684,7 @@ int Packer::patchPackHeader(void *b, int blen) } -bool Packer::getPackHeader(void *b, int blen) +bool Packer::getPackHeader(void *b, int blen, bool allow_incompressible) { if (!ph.fillPackHeader((unsigned char *)b, blen)) return false; @@ -697,7 +697,9 @@ bool Packer::getPackHeader(void *b, int blen) if (!testUnpackVersion(ph.version)) return false; - if (ph.c_len > ph.u_len || (off_t)ph.c_len >= file_size + if (ph.c_len > ph.u_len + || (ph.c_len == ph.u_len && !allow_incompressible) + || (off_t)ph.c_len >= file_size || ph.version <= 0 || ph.version >= 0xff) throwCantUnpack("header corrupted"); else if ((off_t)ph.u_len > ph.u_file_size) @@ -722,14 +724,14 @@ bool Packer::getPackHeader(void *b, int blen) } -bool Packer::readPackHeader(int len) +bool Packer::readPackHeader(int len, bool allow_incompressible) { assert((int)len > 0); MemBuffer buf(len); len = fi->read(buf, len); if (len <= 0) return false; - return getPackHeader(buf, len); + return getPackHeader(buf, len, allow_incompressible); } diff --git a/src/packer.h b/src/packer.h index b6a89f0a..ac165e92 100644 --- a/src/packer.h +++ b/src/packer.h @@ -214,8 +214,8 @@ protected: // packheader handling virtual int patchPackHeader(void *b, int blen); - virtual bool getPackHeader(void *b, int blen); - virtual bool readPackHeader(int len); + virtual bool getPackHeader(void *b, int blen, bool allow_incompressible=false); + virtual bool readPackHeader(int len, bool allow_incompressible=false); virtual void checkAlreadyPacked(const void *b, int blen); // loader core