tls: improve lockless access safety of tls_err_abort()
Most protos' poll() methods insert a memory barrier between writes to sk_err and sk_error_report(). This dates back to commita4d258036e
("tcp: Fix race in tcp_poll"). I guess we should do the same thing in TLS, tcp_poll() does not hold the socket lock. Fixes:3c4d755915
("tls: kernel TLS support") Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Simon Horman <simon.horman@corigine.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aa866ee4b1
commit
8a0d57df89
@ -20,7 +20,9 @@ static void tls_strp_abort_strp(struct tls_strparser *strp, int err)
|
|||||||
strp->stopped = 1;
|
strp->stopped = 1;
|
||||||
|
|
||||||
/* Report an error on the lower socket */
|
/* Report an error on the lower socket */
|
||||||
strp->sk->sk_err = -err;
|
WRITE_ONCE(strp->sk->sk_err, -err);
|
||||||
|
/* Paired with smp_rmb() in tcp_poll() */
|
||||||
|
smp_wmb();
|
||||||
sk_error_report(strp->sk);
|
sk_error_report(strp->sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,9 @@ noinline void tls_err_abort(struct sock *sk, int err)
|
|||||||
{
|
{
|
||||||
WARN_ON_ONCE(err >= 0);
|
WARN_ON_ONCE(err >= 0);
|
||||||
/* sk->sk_err should contain a positive error code. */
|
/* sk->sk_err should contain a positive error code. */
|
||||||
sk->sk_err = -err;
|
WRITE_ONCE(sk->sk_err, -err);
|
||||||
|
/* Paired with smp_rmb() in tcp_poll() */
|
||||||
|
smp_wmb();
|
||||||
sk_error_report(sk);
|
sk_error_report(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user