From e60815be290c2334e9122b10ac53b92b23e7f9a3 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 1 May 2009 00:30:53 +0000 Subject: 3.5 --- Changes | 4 ++++ Makefile.in | 2 +- bench.c | 11 ++++++++--- lzf_c.c | 7 ++++--- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Changes b/Changes index ac57ed3..09581ff 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,7 @@ +3.5 Fri May 1 02:28:42 CEST 2009 + - lzf_compress did sometimes write one octet past the given output + buffer (analyzed and nice testcase by Salvatore Sanfilippo). + 3.4 Tue Sep 2 06:45:00 CEST 2008 - the fix from 3.3 introduced a compression bug, which is fixed in this release (which explains the mysterious prerelease...). Thanks diff --git a/Makefile.in b/Makefile.in index 8e747b2..bbd53c0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -VERSION = 3.0 +VERSION = 3.5 prefix = @prefix@ exec_prefix = @exec_prefix@ diff --git a/bench.c b/bench.c index 5888951..27e0dcc 100644 --- a/bench.c +++ b/bench.c @@ -69,18 +69,23 @@ int main(void) s=stamp(); //snprintf (buf, 64, "<1.%llx>", (unsigned long long)0xa234567812ULL); - //getpgrp(); + getpgrp(); //kill (0, SIGURG); //write (evfd, &ctr, 8); //read (evfd, &ctr, 8); //write (p[1], &buf, 1); //read (p[0], &buf, 4); //stat ("/etc/passwd", &sbuf); - free(malloc(8*1024*1024)); + //struct timeval tv; + //gettimeofday (&tv, 0); + + l = lzf_compress (data, DSIZE, data2, DSIZE*2); + assert(l); si[0]=measure(s); - //j = lzf_decompress (data2, l, data3, DSIZE*2); + j = lzf_decompress (data2, l, data3, DSIZE*2); + assert (j == DSIZE); printf ("\r%10d (%d) ", si[0], l); if (si[0] < min && si[0] > 0) diff --git a/lzf_c.c b/lzf_c.c index 99dab09..0b5d816 100644 --- a/lzf_c.c +++ b/lzf_c.c @@ -170,12 +170,13 @@ lzf_compress (const void *const in_data, unsigned int in_len, unsigned int maxlen = in_end - ip - len; maxlen = maxlen > MAX_REF ? MAX_REF : maxlen; + if (expect_false (op + 3 + 1 >= out_end)) /* first a faster conservative test */ + if (op - !lit + 3 + 1 >= out_end) /* second the exact but rare test */ + return 0; + op [- lit - 1] = lit - 1; /* stop run */ op -= !lit; /* undo run if length is zero */ - if (expect_false (op + 3 + 1 >= out_end)) - return 0; - for (;;) { if (expect_true (maxlen > 16)) -- cgit v1.2.3