| From c362525ba3837c6ff77458c991ca25c5d6532ea2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 12 Aug 2020 14:58:25 +0200 |
| Subject: crypto: algif_aead - fix uninitialized ctx->init |
| |
| From: Ondrej Mosnacek <omosnace@redhat.com> |
| |
| [ Upstream commit 21dfbcd1f5cbff9cf2f9e7e43475aed8d072b0dd ] |
| |
| In skcipher_accept_parent_nokey() the whole af_alg_ctx structure is |
| cleared by memset() after allocation, so add such memset() also to |
| aead_accept_parent_nokey() so that the new "init" field is also |
| initialized to zero. Without that the initial ctx->init checks might |
| randomly return true and cause errors. |
| |
| While there, also remove the redundant zero assignments in both |
| functions. |
| |
| Found via libkcapi testsuite. |
| |
| Cc: Stephan Mueller <smueller@chronox.de> |
| Fixes: f3c802a1f300 ("crypto: algif_aead - Only wake up when ctx->more is zero") |
| Suggested-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| crypto/algif_aead.c | 6 ------ |
| crypto/algif_skcipher.c | 7 +------ |
| 2 files changed, 1 insertion(+), 12 deletions(-) |
| |
| diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c |
| index d48d2156e6210..43c6aa784858b 100644 |
| --- a/crypto/algif_aead.c |
| +++ b/crypto/algif_aead.c |
| @@ -558,12 +558,6 @@ static int aead_accept_parent_nokey(void *private, struct sock *sk) |
| |
| INIT_LIST_HEAD(&ctx->tsgl_list); |
| ctx->len = len; |
| - ctx->used = 0; |
| - atomic_set(&ctx->rcvused, 0); |
| - ctx->more = 0; |
| - ctx->merge = 0; |
| - ctx->enc = 0; |
| - ctx->aead_assoclen = 0; |
| crypto_init_wait(&ctx->wait); |
| |
| ask->private = ctx; |
| diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c |
| index a51ba22fef58f..81c4022285a7c 100644 |
| --- a/crypto/algif_skcipher.c |
| +++ b/crypto/algif_skcipher.c |
| @@ -333,6 +333,7 @@ static int skcipher_accept_parent_nokey(void *private, struct sock *sk) |
| ctx = sock_kmalloc(sk, len, GFP_KERNEL); |
| if (!ctx) |
| return -ENOMEM; |
| + memset(ctx, 0, len); |
| |
| ctx->iv = sock_kmalloc(sk, crypto_skcipher_ivsize(tfm), |
| GFP_KERNEL); |
| @@ -340,16 +341,10 @@ static int skcipher_accept_parent_nokey(void *private, struct sock *sk) |
| sock_kfree_s(sk, ctx, len); |
| return -ENOMEM; |
| } |
| - |
| memset(ctx->iv, 0, crypto_skcipher_ivsize(tfm)); |
| |
| INIT_LIST_HEAD(&ctx->tsgl_list); |
| ctx->len = len; |
| - ctx->used = 0; |
| - atomic_set(&ctx->rcvused, 0); |
| - ctx->more = 0; |
| - ctx->merge = 0; |
| - ctx->enc = 0; |
| crypto_init_wait(&ctx->wait); |
| |
| ask->private = ctx; |
| -- |
| 2.25.1 |
| |