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;
 
        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;
 }
 
                   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;
 
        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);
 
        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;
 }