• Jason Wang's avatar
    tuntap: correctly wake up process during uninit · addf8fc4
    Jason Wang authored
    We used to check dev->reg_state against NETREG_REGISTERED after each
    time we are woke up. But after commit 9e641bdc ("net-tun:
    restructure tun_do_read for better sleep/wakeup efficiency"), it uses
    skb_recv_datagram() which does not check dev->reg_state. This will
    result if we delete a tun/tap device after a process is blocked in the
    reading. The device will wait for the reference count which was held
    by that process for ever.
    
    Fixes this by using RCV_SHUTDOWN which will be checked during
    sk_recv_datagram() before trying to wake up the process during uninit.
    
    Fixes: 9e641bdc ("net-tun: restructure tun_do_read for better
    sleep/wakeup efficiency")
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Xi Wang <xii@google.com>
    Cc: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    addf8fc4
tun.c 58.9 KB