Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/opencrypto/deflate.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/opencrypto/deflate.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.7 retrieving revision 1.8 diff -u -p -r1.7 -r1.8 --- src/sys/opencrypto/deflate.c 2006/11/16 01:33:51 1.7 +++ src/sys/opencrypto/deflate.c 2007/05/21 11:35:16 1.8 @@ -1,4 +1,4 @@ -/* $NetBSD: deflate.c,v 1.7 2006/11/16 01:33:51 christos Exp $ */ +/* $NetBSD: deflate.c,v 1.8 2007/05/21 11:35:16 degroote Exp $ */ /* $FreeBSD: src/sys/opencrypto/deflate.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $ */ /* $OpenBSD: deflate.c,v 1.3 2001/08/20 02:45:22 hugh Exp $ */ @@ -35,7 +35,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: deflate.c,v 1.7 2006/11/16 01:33:51 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: deflate.c,v 1.8 2007/05/21 11:35:16 degroote Exp $"); #include #include @@ -82,10 +82,16 @@ deflate_global(data, size, decomp, out) u_int8_t *output; u_int32_t count, result; int error, i = 0, j; - struct deflate_buf buf[ZBUF]; + struct deflate_buf *buf, *tmp; + size_t len, old_len; - bzero(&zbuf, sizeof(z_stream)); - for (j = 0; j < ZBUF; j++) + len = ZBUF; + buf = malloc(len*sizeof(struct deflate_buf), M_CRYPTO_DATA, M_NOWAIT); + if (buf == NULL) + return 0; + + memset(&zbuf, 0, sizeof(z_stream)); + for (j = 0; j < len; j++) buf[j].flag = 0; zbuf.next_in = data; /* data that is going to be processed */ @@ -133,7 +139,18 @@ deflate_global(data, size, decomp, out) goto bad; else if (zbuf.avail_in == 0 && zbuf.avail_out != 0) goto end; - else if (zbuf.avail_out == 0 && i < (ZBUF - 1)) { + else if (zbuf.avail_out == 0) { + if (i == (len-1)) { + old_len = i; + len += ZBUF; + tmp = realloc(buf,len*sizeof(struct deflate_buf), + M_CRYPTO_DATA, M_NOWAIT); + if (tmp == NULL) + goto bad; + buf = tmp; + for (j = old_len; j < len; j++) + buf[j].flag = 0; + } /* we need more output space, allocate size */ buf[i].out = malloc(size, M_CRYPTO_DATA, M_NOWAIT); if (buf[i].out == NULL) @@ -160,25 +177,27 @@ end: output = *out; for (j = 0; buf[j].flag != 0; j++) { if (count > buf[j].size) { - bcopy(buf[j].out, *out, buf[j].size); + memcpy(buf[j].out, *out, buf[j].size); *out += buf[j].size; - FREE(buf[j].out, M_CRYPTO_DATA); + free(buf[j].out, M_CRYPTO_DATA); count -= buf[j].size; } else { /* it should be the last buffer */ - bcopy(buf[j].out, *out, count); + memcpy(buf[j].out, *out, count); *out += count; - FREE(buf[j].out, M_CRYPTO_DATA); + free(buf[j].out, M_CRYPTO_DATA); count = 0; } } + free(buf, M_CRYPTO_DATA); *out = output; return result; bad: *out = NULL; for (j = 0; buf[j].flag != 0; j++) - FREE(buf[j].out, M_CRYPTO_DATA); + free(buf[j].out, M_CRYPTO_DATA); + free(buf, M_CRYPTO_DATA); if (decomp) inflateEnd(&zbuf); else