Skip to content

Commit

Permalink
tls: separate no-async decryption request handling from async
Browse files Browse the repository at this point in the history
If we're not doing async, the handling is much simpler. There's no
reference counting, we just need to wait for the completion to wake us
up and return its result.

We should preferably also use a separate crypto_wait. I'm not seeing a
UAF as I did in the past, I think aec7961 ("tls: fix race between
async notify and socket close") took care of it.

This will make the next fix easier.

Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://lore.kernel.org/r/47bde5f649707610eaef9f0d679519966fc31061.1709132643.git.sd@queasysnail.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
qsn authored and kuba-moo committed Feb 29, 2024
1 parent 6caaf10 commit 41532b7
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions net/tls/tls_sw.c
Original file line number Diff line number Diff line change
Expand Up @@ -274,9 +274,15 @@ static int tls_do_decryption(struct sock *sk,
DEBUG_NET_WARN_ON_ONCE(atomic_read(&ctx->decrypt_pending) < 1);
atomic_inc(&ctx->decrypt_pending);
} else {
DECLARE_CRYPTO_WAIT(wait);

aead_request_set_callback(aead_req,
CRYPTO_TFM_REQ_MAY_BACKLOG,
crypto_req_done, &ctx->async_wait);
crypto_req_done, &wait);
ret = crypto_aead_decrypt(aead_req);
if (ret == -EINPROGRESS || ret == -EBUSY)
ret = crypto_wait_req(ret, &wait);
return ret;
}

ret = crypto_aead_decrypt(aead_req);
Expand All @@ -285,10 +291,7 @@ static int tls_do_decryption(struct sock *sk,
ret = ret ?: -EINPROGRESS;
}
if (ret == -EINPROGRESS) {
if (darg->async)
return 0;

ret = crypto_wait_req(ret, &ctx->async_wait);
return 0;
} else if (darg->async) {
atomic_dec(&ctx->decrypt_pending);
}
Expand Down

0 comments on commit 41532b7

Please sign in to comment.