From 68f35deb866cb2c09e610eb58a27d7a89d16f076 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Sat, 20 May 2006 13:29:01 +0200 Subject: [PATCH] Fixed a rare boundary problem in Packer::compressWithFilters(). The comparision if an update might be possible later was using "<" instead of "<=" which resulted in missing calls to findOverlapOverhead() and buildLoader(). Also, the comparision had not been updated for the newly added hdr_clen fields. This fixes sf.net bug #1477825. --- src/packer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/packer.cpp b/src/packer.cpp index 760eaf63..bbed85c5 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -1422,6 +1422,7 @@ void Packer::compressWithFilters(Filter *parm_ft, ph = orig_ph; ph.method = methods[m]; ph.filter = filters[i]; + ph.overlap_overhead = 0; // get fresh filter Filter ft = orig_ft; ft.init(ph.filter, orig_ft.addvalue); @@ -1462,11 +1463,12 @@ void Packer::compressWithFilters(Filter *parm_ft, if (compress(ibuf + compress_buf_off, *otemp, max_offset, max_match)) { unsigned lsize = 0; - if (ph.c_len + lsize < best_ph.c_len + best_ph_lsize) + if (ph.c_len + lsize + hdr_clen <= best_ph.c_len + best_ph_lsize + best_hdr_clen) { // get results ph.overlap_overhead = findOverlapOverhead(*otemp, overlap_range); lsize = buildLoader(&ft); + assert(lsize > 0); } #if 0 printf("\n%2d %02x: %d +%4d +%3d = %d (best: %d +%4d +%3d = %d)\n", ph.method, ph.filter, @@ -1490,6 +1492,7 @@ void Packer::compressWithFilters(Filter *parm_ft, } if (update) { + assert((int)ph.overlap_overhead > 0); // update obuf[] with best version if (otemp != &obuf) memcpy(obuf, *otemp, ph.c_len);