1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

Allow unfilter when verifyOverlappingDecompression, for convenience

in end-to-end checksum.
	packer.h packer.cpp p_unix.cpp

committer: jreiser <jreiser> 1141252960 +0000
This commit is contained in:
John Reiser 2006-03-01 22:42:40 +00:00
parent d461ebbda1
commit af7de75ad4
3 changed files with 11 additions and 8 deletions

View File

@ -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);

View File

@ -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 */
}

View File

@ -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