Skip to content

Commit 7bb0931

Browse files
V4belkuba-moo
authored andcommitted
tls: Fix race condition in tls_sw_cancel_work_tx()
This issue was discovered during a code audit. After cancel_delayed_work_sync() is called from tls_sk_proto_close(), tx_work_handler() can still be scheduled from paths such as the Delayed ACK handler or ksoftirqd. As a result, the tx_work_handler() worker may dereference a freed TLS object. The following is a simple race scenario: cpu0 cpu1 tls_sk_proto_close() tls_sw_cancel_work_tx() tls_write_space() tls_sw_write_space() if (!test_and_set_bit(BIT_TX_SCHEDULED, &tx_ctx->tx_bitmask)) set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask); cancel_delayed_work_sync(&ctx->tx_work.work); schedule_delayed_work(&tx_ctx->tx_work.work, 0); To prevent this race condition, cancel_delayed_work_sync() is replaced with disable_delayed_work_sync(). Fixes: f87e62d ("net/tls: remove close callback sock unlock/lock around TX work flush") Signed-off-by: Hyunwoo Kim <imv4bel@gmail.com> Reviewed-by: Simon Horman <horms@kernel.org> Reviewed-by: Sabrina Dubroca <sd@queasysnail.net> Link: https://patch.msgid.link/aZgsFO6nfylfvLE7@v4bel Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 8a8a9fa commit 7bb0931

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

net/tls/tls_sw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2533,7 +2533,7 @@ void tls_sw_cancel_work_tx(struct tls_context *tls_ctx)
25332533

25342534
set_bit(BIT_TX_CLOSING, &ctx->tx_bitmask);
25352535
set_bit(BIT_TX_SCHEDULED, &ctx->tx_bitmask);
2536-
cancel_delayed_work_sync(&ctx->tx_work.work);
2536+
disable_delayed_work_sync(&ctx->tx_work.work);
25372537
}
25382538

25392539
void tls_sw_release_resources_tx(struct sock *sk)

0 commit comments

Comments
 (0)