From af7de75ad464d3d2d975f698b4cf304425142af7 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Wed, 1 Mar 2006 22:42:40 +0000 Subject: [PATCH] Allow unfilter when verifyOverlappingDecompression, for convenience in end-to-end checksum. packer.h packer.cpp p_unix.cpp committer: jreiser 1141252960 +0000 --- src/p_unix.cpp | 4 ++-- src/packer.cpp | 9 ++++++--- src/packer.h | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/p_unix.cpp b/src/p_unix.cpp index 988103ab..74f10ca7 100644 --- a/src/p_unix.cpp +++ b/src/p_unix.cpp @@ -411,8 +411,8 @@ void PackUnix::packExtent( // write compressed data if (ph.c_len < ph.u_len) { fo->write(obuf, ph.c_len); - // Checks ph.u_adler after decompression but before unfiltering - verifyOverlappingDecompression(); + // Checks ph.u_adler after decompression, after unfiltering + verifyOverlappingDecompression(ft); } else { fo->write(ibuf, ph.u_len); diff --git a/src/packer.cpp b/src/packer.cpp index 2b459e90..76264df5 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -295,7 +295,7 @@ bool Packer::checkFinalCompressionRatio(const OutputFile *fo) const **************************************************************************/ void Packer::decompress(const upx_bytep in, upx_bytep out, - bool verify_checksum) + bool verify_checksum, Filter *fp) { unsigned adler; @@ -316,6 +316,9 @@ void Packer::decompress(const upx_bytep in, upx_bytep out, // verify checksum of decompressed data if (verify_checksum) { + if (fp) { + fp->unfilter(out, ph.u_len); + } adler = upx_adler32(out, ph.u_len, ph.saved_u_adler); if (adler != ph.u_adler) throwChecksumError(); @@ -355,7 +358,7 @@ bool Packer::testOverlappingDecompression(const upx_bytep buf, } -void Packer::verifyOverlappingDecompression() +void Packer::verifyOverlappingDecompression(Filter *fp) { assert(ph.c_len < ph.u_len); assert((int)ph.overlap_overhead > 0); @@ -381,7 +384,7 @@ void Packer::verifyOverlappingDecompression() if (offset + ph.c_len > obuf.getSize()) return; memmove(obuf + offset, obuf, ph.c_len); - decompress(obuf + offset, obuf, true); + decompress(obuf + offset, obuf, true, fp); obuf.checkState(); #endif /* !UNUPX */ } diff --git a/src/packer.h b/src/packer.h index 618f5f19..b2de61ca 100644 --- a/src/packer.h +++ b/src/packer.h @@ -160,8 +160,8 @@ protected: // main compression drivers virtual bool compress(upx_bytep in, upx_bytep out, unsigned max_offset = 0, unsigned max_match = 0); - virtual void decompress(const upx_bytep in, - upx_bytep out, bool verify_checksum=true); + virtual void decompress(const upx_bytep in, upx_bytep out, + bool verify_checksum = true, Filter *fp = 0); virtual bool checkCompressionRatio(unsigned u_len, unsigned c_len) const; virtual bool checkFinalCompressionRatio(const OutputFile *fo) const; @@ -185,7 +185,7 @@ protected: unsigned range = 0, unsigned upper_limit = ~0u) const; // destructive decompress + verify - virtual void verifyOverlappingDecompression(); + virtual void verifyOverlappingDecompression(Filter *fp = 0); // packheader handling