{
        struct crypto_alg *base = &alg->halg.base;
 
-       if (alg->halg.digestsize > PAGE_SIZE / 8 ||
-           alg->halg.statesize > PAGE_SIZE / 8 ||
+       if (alg->halg.digestsize > HASH_MAX_DIGESTSIZE ||
+           alg->halg.statesize > HASH_MAX_STATESIZE ||
            alg->halg.statesize == 0)
                return -EINVAL;
 
 
        struct alg_sock *ask = alg_sk(sk);
        struct hash_ctx *ctx = ask->private;
        struct ahash_request *req = &ctx->req;
-       char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req)) ? : 1];
+       char state[HASH_MAX_STATESIZE];
        struct sock *sk2;
        struct alg_sock *ask2;
        struct hash_ctx *ctx2;
 
 {
        struct crypto_alg *base = &alg->base;
 
-       if (alg->digestsize > PAGE_SIZE / 8 ||
-           alg->descsize > PAGE_SIZE / 8 ||
-           alg->statesize > PAGE_SIZE / 8)
+       if (alg->digestsize > HASH_MAX_DIGESTSIZE ||
+           alg->descsize > HASH_MAX_DESCSIZE ||
+           alg->statesize > HASH_MAX_STATESIZE)
                return -EINVAL;
 
        base->cra_type = &crypto_shash_type;
 
        void *__ctx[] CRYPTO_MINALIGN_ATTR;
 };
 
+#define HASH_MAX_DIGESTSIZE     64
+#define HASH_MAX_DESCSIZE      360
+#define HASH_MAX_STATESIZE     512
+
 #define SHASH_DESC_ON_STACK(shash, ctx)                                  \
        char __##shash##_desc[sizeof(struct shash_desc) +         \
-               crypto_shash_descsize(ctx)] CRYPTO_MINALIGN_ATTR; \
+               HASH_MAX_DESCSIZE] CRYPTO_MINALIGN_ATTR; \
        struct shash_desc *shash = (struct shash_desc *)__##shash##_desc
 
 /**