crypto: algif_hash - Allocate hash state with kmalloc
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 28 Mar 2023 03:54:24 +0000 (11:54 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 6 Apr 2023 08:18:53 +0000 (16:18 +0800)
Allocating the hash state on the stack limits its size.  Change
this to use kmalloc so the limit can be removed for new drivers.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/algif_hash.c

index 1d017ec..63af72e 100644 (file)
@@ -235,24 +235,31 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
        struct alg_sock *ask = alg_sk(sk);
        struct hash_ctx *ctx = ask->private;
        struct ahash_request *req = &ctx->req;
-       char state[HASH_MAX_STATESIZE];
+       struct crypto_ahash *tfm;
        struct sock *sk2;
        struct alg_sock *ask2;
        struct hash_ctx *ctx2;
+       char *state;
        bool more;
        int err;
 
+       tfm = crypto_ahash_reqtfm(req);
+       state = kmalloc(crypto_ahash_statesize(tfm), GFP_KERNEL);
+       err = -ENOMEM;
+       if (!state)
+               goto out;
+
        lock_sock(sk);
        more = ctx->more;
        err = more ? crypto_ahash_export(req, state) : 0;
        release_sock(sk);
 
        if (err)
-               return err;
+               goto out_free_state;
 
        err = af_alg_accept(ask->parent, newsock, kern);
        if (err)
-               return err;
+               goto out_free_state;
 
        sk2 = newsock->sk;
        ask2 = alg_sk(sk2);
@@ -260,7 +267,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
        ctx2->more = more;
 
        if (!more)
-               return err;
+               goto out_free_state;
 
        err = crypto_ahash_import(&ctx2->req, state);
        if (err) {
@@ -268,6 +275,10 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
                sock_put(sk2);
        }
 
+out_free_state:
+       kfree_sensitive(state);
+
+out:
        return err;
 }