|
@@ -124,7 +124,7 @@ int zip_compress(const u8 *src, unsigned int slen,
|
|
|
struct zip_kernel_ctx *zip_ctx)
|
|
|
{
|
|
|
struct zip_operation *zip_ops = NULL;
|
|
|
- struct zip_state zip_state;
|
|
|
+ struct zip_state *zip_state;
|
|
|
struct zip_device *zip = NULL;
|
|
|
int ret;
|
|
|
|
|
@@ -135,20 +135,23 @@ int zip_compress(const u8 *src, unsigned int slen,
|
|
|
if (!zip)
|
|
|
return -ENODEV;
|
|
|
|
|
|
- memset(&zip_state, 0, sizeof(struct zip_state));
|
|
|
+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
|
|
|
+ if (!zip_state)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
zip_ops = &zip_ctx->zip_comp;
|
|
|
|
|
|
zip_ops->input_len = slen;
|
|
|
zip_ops->output_len = *dlen;
|
|
|
memcpy(zip_ops->input, src, slen);
|
|
|
|
|
|
- ret = zip_deflate(zip_ops, &zip_state, zip);
|
|
|
+ ret = zip_deflate(zip_ops, zip_state, zip);
|
|
|
|
|
|
if (!ret) {
|
|
|
*dlen = zip_ops->output_len;
|
|
|
memcpy(dst, zip_ops->output, *dlen);
|
|
|
}
|
|
|
-
|
|
|
+ kfree(zip_state);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -157,7 +160,7 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
|
|
struct zip_kernel_ctx *zip_ctx)
|
|
|
{
|
|
|
struct zip_operation *zip_ops = NULL;
|
|
|
- struct zip_state zip_state;
|
|
|
+ struct zip_state *zip_state;
|
|
|
struct zip_device *zip = NULL;
|
|
|
int ret;
|
|
|
|
|
@@ -168,7 +171,10 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
|
|
if (!zip)
|
|
|
return -ENODEV;
|
|
|
|
|
|
- memset(&zip_state, 0, sizeof(struct zip_state));
|
|
|
+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
|
|
|
+ if (!zip_state)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
zip_ops = &zip_ctx->zip_decomp;
|
|
|
memcpy(zip_ops->input, src, slen);
|
|
|
|
|
@@ -179,13 +185,13 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
|
|
zip_ops->input_len = slen;
|
|
|
zip_ops->output_len = *dlen;
|
|
|
|
|
|
- ret = zip_inflate(zip_ops, &zip_state, zip);
|
|
|
+ ret = zip_inflate(zip_ops, zip_state, zip);
|
|
|
|
|
|
if (!ret) {
|
|
|
*dlen = zip_ops->output_len;
|
|
|
memcpy(dst, zip_ops->output, *dlen);
|
|
|
}
|
|
|
-
|
|
|
+ kfree(zip_state);
|
|
|
return ret;
|
|
|
}
|
|
|
|