lkml.org 
[lkml]   [2019]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 111/115] tipc: fix hanging clients using poll with EPOLLOUT flag
    Date
    From: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@gmail.com>

    [ Upstream commit ff946833b70e0c7f93de9a3f5b329b5ae2287b38 ]

    commit 517d7c79bdb398 ("tipc: fix hanging poll() for stream sockets")
    introduced a regression for clients using non-blocking sockets.
    After the commit, we send EPOLLOUT event to the client even in
    TIPC_CONNECTING state. This causes the subsequent send() to fail
    with ENOTCONN, as the socket is still not in TIPC_ESTABLISHED state.

    In this commit, we:
    - improve the fix for hanging poll() by replacing sk_data_ready()
    with sk_state_change() to wake up all clients.
    - revert the faulty updates introduced by commit 517d7c79bdb398
    ("tipc: fix hanging poll() for stream sockets").

    Fixes: 517d7c79bdb398 ("tipc: fix hanging poll() for stream sockets")
    Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@gmail.com>
    Acked-by: Jon Maloy <jon.maloy@ericsson.se>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/tipc/socket.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/net/tipc/socket.c
    +++ b/net/tipc/socket.c
    @@ -709,11 +709,11 @@ static unsigned int tipc_poll(struct fil

    switch (sk->sk_state) {
    case TIPC_ESTABLISHED:
    - case TIPC_CONNECTING:
    if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk))
    mask |= POLLOUT;
    /* fall thru' */
    case TIPC_LISTEN:
    + case TIPC_CONNECTING:
    if (!skb_queue_empty(&sk->sk_receive_queue))
    mask |= (POLLIN | POLLRDNORM);
    break;
    @@ -1588,7 +1588,7 @@ static bool filter_connect(struct tipc_s
    return true;

    /* If empty 'ACK-' message, wake up sleeping connect() */
    - sk->sk_data_ready(sk);
    + sk->sk_state_change(sk);

    /* 'ACK-' message is neither accepted nor rejected: */
    msg_set_dest_droppable(hdr, 1);

    \
     
     \ /
      Last update: 2019-05-15 13:53    [W:2.714 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site