summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <root>2009-05-01 00:30:53 +0000
committerroot <root>2009-05-01 00:30:53 +0000
commite60815be290c2334e9122b10ac53b92b23e7f9a3 (patch)
tree7f9d8726a2bea476f2b731dec0eae23db48136b4
parent2765a97bc918b1ea0c8aff8c66535d34c01a8998 (diff)
-rw-r--r--Changes4
-rw-r--r--Makefile.in2
-rw-r--r--bench.c11
-rw-r--r--lzf_c.c7
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))