Skip to content

Commit

Permalink
dccp: annotate data-races in dccp_poll()
Browse files Browse the repository at this point in the history
We changed tcp_poll() over time, bug never updated dccp.

Note that we also could remove dccp instead of maintaining it.

Fixes: 7c65787 ("[DCCP]: Initial implementation")
Signed-off-by: Eric Dumazet <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
Eric Dumazet authored and kuba-moo committed Aug 19, 2023
1 parent 76f3329 commit cba3f17
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions net/dccp/proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,11 +315,15 @@ EXPORT_SYMBOL_GPL(dccp_disconnect);
__poll_t dccp_poll(struct file *file, struct socket *sock,
poll_table *wait)
{
__poll_t mask;
struct sock *sk = sock->sk;
__poll_t mask;
u8 shutdown;
int state;

sock_poll_wait(file, sock, wait);
if (sk->sk_state == DCCP_LISTEN)

state = inet_sk_state_load(sk);
if (state == DCCP_LISTEN)
return inet_csk_listen_poll(sk);

/* Socket is not locked. We are protected from async events
Expand All @@ -328,20 +332,21 @@ __poll_t dccp_poll(struct file *file, struct socket *sock,
*/

mask = 0;
if (sk->sk_err)
if (READ_ONCE(sk->sk_err))
mask = EPOLLERR;
shutdown = READ_ONCE(sk->sk_shutdown);

if (sk->sk_shutdown == SHUTDOWN_MASK || sk->sk_state == DCCP_CLOSED)
if (shutdown == SHUTDOWN_MASK || state == DCCP_CLOSED)
mask |= EPOLLHUP;
if (sk->sk_shutdown & RCV_SHUTDOWN)
if (shutdown & RCV_SHUTDOWN)
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;

/* Connected? */
if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_RESPOND)) {
if ((1 << state) & ~(DCCPF_REQUESTING | DCCPF_RESPOND)) {
if (atomic_read(&sk->sk_rmem_alloc) > 0)
mask |= EPOLLIN | EPOLLRDNORM;

if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
if (!(shutdown & SEND_SHUTDOWN)) {
if (sk_stream_is_writeable(sk)) {
mask |= EPOLLOUT | EPOLLWRNORM;
} else { /* send SIGIO later */
Expand All @@ -359,7 +364,6 @@ __poll_t dccp_poll(struct file *file, struct socket *sock,
}
return mask;
}

EXPORT_SYMBOL_GPL(dccp_poll);

int dccp_ioctl(struct sock *sk, int cmd, int *karg)
Expand Down

0 comments on commit cba3f17

Please sign in to comment.