diff --git a/TODO b/TODO index 90459101..9b723eb0 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -UPX TODO list. Last updated 2006-03-11. +UPX TODO list. Last updated 2006-12-06. IMPORTANT PROBLEMS THAT SHOULD BE FIXED SOON: @@ -86,10 +86,6 @@ FORMAT WATCOM/LE - handle holes in the file -- implement compressWithFilters() - -- add a call to verifyOverlappingDecompression() - FORMAT WIN16/NE =============== diff --git a/src/p_wcle.cpp b/src/p_wcle.cpp index f64c299a..9478c58d 100644 --- a/src/p_wcle.cpp +++ b/src/p_wcle.cpp @@ -566,6 +566,9 @@ void PackWcle::pack(OutputFile *fo) writeFile(fo, opt->watcom_le.le); + // verify + verifyOverlappingDecompression(oimage + e_len, oimage.getSize() - e_len); + // copy the overlay const unsigned overlaystart = ih.data_pages_offset + exe_offset + getImageSize(); diff --git a/src/packer.cpp b/src/packer.cpp index 8730cf88..d9f5c4cc 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -366,9 +366,8 @@ void ph_decompress(PackHeader &ph, const upx_bytep in, upx_bytep out, // verify checksum of decompressed data if (verify_checksum) { - if (ft) { + if (ft) ft->unfilter(out, ph.u_len); - } adler = upx_adler32(out, ph.u_len, ph.saved_u_adler); if (adler != ph.u_adler) throwChecksumError(); @@ -450,6 +449,20 @@ void Packer::verifyOverlappingDecompression(Filter *ft) } +void Packer::verifyOverlappingDecompression(upx_bytep o_ptr, unsigned o_size, Filter *ft) +{ + assert(ph.c_len < ph.u_len); + assert((int)ph.overlap_overhead > 0); + if (ph_skipVerify(ph)) + return; + unsigned offset = (ph.u_len + ph.overlap_overhead) - ph.c_len; + if (offset + ph.c_len > o_size) + return; + memmove(o_ptr + offset, o_ptr, ph.c_len); + decompress(o_ptr + offset, o_ptr, true, ft); +} + + /************************************************************************* // Find overhead for in-place decompression in an heuristic way // (using a binary search). Return 0 on error. diff --git a/src/packer.h b/src/packer.h index 5033964f..2e7b44ce 100644 --- a/src/packer.h +++ b/src/packer.h @@ -209,7 +209,8 @@ protected: unsigned range = 0, unsigned upper_limit = ~0u) const; // destructive decompress + verify - virtual void verifyOverlappingDecompression(Filter *ft = NULL); + void verifyOverlappingDecompression(Filter *ft = NULL); + void verifyOverlappingDecompression(upx_bytep o_ptr, unsigned o_size, Filter *ft = NULL); // packheader handling virtual int patchPackHeader(void *b, int blen);