RET_ERR(EINVAL);
len = GET_U32(ptr);
ptr += 4;
+ uns adler = GET_U32(ptr);
+ ptr += 4;
byte *new_ptr = lizard_decompress_safe(ptr, buf->lizard, len);
if (!new_ptr)
return -1;
+ if (adler32(new_ptr, len) != adler)
+ RET_ERR(EINVAL);
if (!copied)
bdirect_read_commit(body, end);
ptr = new_ptr;
bputl(b, lizard_filled
#if 0 //TEST error resilience: write wrong length
+1
+#endif
+ );
+ bputl(b, adler32(lizard_buf.ptr, lizard_filled)
+#if 0 //TEST error resilience: write wrong checksum
+ +1
#endif
);
uns want_len = lizard_filled * LIZARD_MAX_MULTIPLY + LIZARD_MAX_ADD;
void *mi, *mo;
int li, lo;
+ uns adler = 0;
struct stat st;
stat(argv[optind], &st);
else
{
lo = bgetl(fi);
- li -= 4;
+ adler = bgetl(fi);
+ li -= 8;
}
mi = xmalloc(li);
mo = xmalloc(lo);
printf("%d ", li);
if (action == 'd')
- printf("->expected %d ", lo);
+ printf("->expected %d (%08x) ", lo, adler);
fflush(stdout);
if (action != 'd')
lo = lizard_compress(mi, li, mo);
else
+ {
lo = lizard_decompress(mi, mo);
+ if (adler32(mo, lo) != adler)
+ printf("wrong Adler32 ");
+ }
printf("-> %d ", lo);
fflush(stdout);
{
struct fastbuf *fo = bopen(argv[optind+1], O_CREAT | O_TRUNC | O_WRONLY, 1<<16);
if (action == 'c')
+ {
bputl(fo, li);
+ bputl(fo, adler32(mi, li));
+ }
bwrite(fo, mo, lo);
bclose(fo);
}