diff options
Diffstat (limited to 'crypto/zlib.c')
| -rw-r--r-- | crypto/zlib.c | 28 | 
1 files changed, 15 insertions, 13 deletions
diff --git a/crypto/zlib.c b/crypto/zlib.c index c3015733c99..06b62e5cdcc 100644 --- a/crypto/zlib.c +++ b/crypto/zlib.c @@ -29,7 +29,6 @@  #include <linux/interrupt.h>  #include <linux/mm.h>  #include <linux/net.h> -#include <linux/slab.h>  #include <crypto/internal/compress.h> @@ -60,7 +59,7 @@ static void zlib_decomp_exit(struct zlib_ctx *ctx)  	if (stream->workspace) {  		zlib_inflateEnd(stream); -		kfree(stream->workspace); +		vfree(stream->workspace);  		stream->workspace = NULL;  	}  } @@ -85,6 +84,7 @@ static int zlib_compress_setup(struct crypto_pcomp *tfm, void *params,  	struct zlib_ctx *ctx = crypto_tfm_ctx(crypto_pcomp_tfm(tfm));  	struct z_stream_s *stream = &ctx->comp_stream;  	struct nlattr *tb[ZLIB_COMP_MAX + 1]; +	int window_bits, mem_level;  	size_t workspacesize;  	int ret; @@ -94,12 +94,18 @@ static int zlib_compress_setup(struct crypto_pcomp *tfm, void *params,  	zlib_comp_exit(ctx); -	workspacesize = zlib_deflate_workspacesize(); -	stream->workspace = vmalloc(workspacesize); +	window_bits = tb[ZLIB_COMP_WINDOWBITS] +					? nla_get_u32(tb[ZLIB_COMP_WINDOWBITS]) +					: MAX_WBITS; +	mem_level = tb[ZLIB_COMP_MEMLEVEL] +					? nla_get_u32(tb[ZLIB_COMP_MEMLEVEL]) +					: DEF_MEM_LEVEL; + +	workspacesize = zlib_deflate_workspacesize(window_bits, mem_level); +	stream->workspace = vzalloc(workspacesize);  	if (!stream->workspace)  		return -ENOMEM; -	memset(stream->workspace, 0, workspacesize);  	ret = zlib_deflateInit2(stream,  				tb[ZLIB_COMP_LEVEL]  					? nla_get_u32(tb[ZLIB_COMP_LEVEL]) @@ -107,12 +113,8 @@ static int zlib_compress_setup(struct crypto_pcomp *tfm, void *params,  				tb[ZLIB_COMP_METHOD]  					? nla_get_u32(tb[ZLIB_COMP_METHOD])  					: Z_DEFLATED, -				tb[ZLIB_COMP_WINDOWBITS] -					? nla_get_u32(tb[ZLIB_COMP_WINDOWBITS]) -					: MAX_WBITS, -				tb[ZLIB_COMP_MEMLEVEL] -					? nla_get_u32(tb[ZLIB_COMP_MEMLEVEL]) -					: DEF_MEM_LEVEL, +				window_bits, +				mem_level,  				tb[ZLIB_COMP_STRATEGY]  					? nla_get_u32(tb[ZLIB_COMP_STRATEGY])  					: Z_DEFAULT_STRATEGY); @@ -225,13 +227,13 @@ static int zlib_decompress_setup(struct crypto_pcomp *tfm, void *params,  				 ? nla_get_u32(tb[ZLIB_DECOMP_WINDOWBITS])  				 : DEF_WBITS; -	stream->workspace = kzalloc(zlib_inflate_workspacesize(), GFP_KERNEL); +	stream->workspace = vzalloc(zlib_inflate_workspacesize());  	if (!stream->workspace)  		return -ENOMEM;  	ret = zlib_inflateInit2(stream, ctx->decomp_windowBits);  	if (ret != Z_OK) { -		kfree(stream->workspace); +		vfree(stream->workspace);  		stream->workspace = NULL;  		return -EINVAL;  	}  | 
