X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Flzjb.c;fp=module%2Fzfs%2Flzjb.c;h=4da30cf17d98af6667d2a0421d714c31f8a112b2;hb=18a89ba43d3e5e8a31d50838c93ec26d1cb27429;hp=ad9e423f836d25ef88e24287cb0daf040f0939cf;hpb=bf701a83c5ec192be6d3afe87ebeee45ce9127f4;p=zfs.git diff --git a/module/zfs/lzjb.c b/module/zfs/lzjb.c index ad9e423..4da30cf 100644 --- a/module/zfs/lzjb.c +++ b/module/zfs/lzjb.c @@ -36,7 +36,7 @@ * source length if compression would overflow the destination buffer. */ -#include +#include #define MATCH_BITS 6 #define MATCH_MIN 3 @@ -54,12 +54,15 @@ lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n) int copymask = 1 << (NBBY - 1); int mlen, offset, hash; uint16_t *hp; - uint16_t lempel[LEMPEL_SIZE] = { 0 }; + uint16_t *lempel; + lempel = kmem_zalloc(LEMPEL_SIZE * sizeof (uint16_t), KM_SLEEP); while (src < (uchar_t *)s_start + s_len) { if ((copymask <<= 1) == (1 << NBBY)) { - if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY) + if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY) { + kmem_free(lempel, LEMPEL_SIZE*sizeof(uint16_t)); return (s_len); + } copymask = 1; copymap = dst; *dst++ = 0; @@ -89,6 +92,8 @@ lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n) *dst++ = *src++; } } + + kmem_free(lempel, LEMPEL_SIZE * sizeof (uint16_t)); return (dst - (uchar_t *)d_start); }