lkml.org 
[lkml]   [2014]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 091/142] Bluetooth: never linger on process exit
    Date
    From: Vladimir Davydov <vdavydov@parallels.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit 093facf3634da1b0c2cc7ed106f1983da901bbab upstream.

    If the current process is exiting, lingering on socket close will make
    it unkillable, so we should avoid it.

    Reproducer:

    #include <sys/types.h>
    #include <sys/socket.h>

    #define BTPROTO_L2CAP 0
    #define BTPROTO_SCO 2
    #define BTPROTO_RFCOMM 3

    int main()
    {
    int fd;
    struct linger ling;

    fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
    //or: fd = socket(PF_BLUETOOTH, SOCK_DGRAM, BTPROTO_L2CAP);
    //or: fd = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);

    ling.l_onoff = 1;
    ling.l_linger = 1000000000;
    setsockopt(fd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

    return 0;
    }

    Signed-off-by: Vladimir Davydov <vdavydov@parallels.com>
    Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    net/bluetooth/l2cap_sock.c | 3 ++-
    net/bluetooth/rfcomm/sock.c | 3 ++-
    net/bluetooth/sco.c | 6 ++++--
    3 files changed, 8 insertions(+), 4 deletions(-)

    diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
    index a3a81d96314b..2710e850b74c 100644
    --- a/net/bluetooth/l2cap_sock.c
    +++ b/net/bluetooth/l2cap_sock.c
    @@ -882,7 +882,8 @@ static int l2cap_sock_shutdown(struct socket *sock, int how)
    l2cap_chan_close(chan, 0);
    lock_sock(sk);

    - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
    + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
    + !(current->flags & PF_EXITING))
    err = bt_sock_wait_state(sk, BT_CLOSED,
    sk->sk_lingertime);
    }
    diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
    index c1c6028e389a..7ca014daa5ab 100644
    --- a/net/bluetooth/rfcomm/sock.c
    +++ b/net/bluetooth/rfcomm/sock.c
    @@ -887,7 +887,8 @@ static int rfcomm_sock_shutdown(struct socket *sock, int how)
    sk->sk_shutdown = SHUTDOWN_MASK;
    __rfcomm_sock_close(sk);

    - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
    + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
    + !(current->flags & PF_EXITING))
    err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
    }
    release_sock(sk);
    diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
    index d021e441b6e6..4f5f01b779b5 100644
    --- a/net/bluetooth/sco.c
    +++ b/net/bluetooth/sco.c
    @@ -913,7 +913,8 @@ static int sco_sock_shutdown(struct socket *sock, int how)
    sco_sock_clear_timer(sk);
    __sco_sock_close(sk);

    - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
    + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
    + !(current->flags & PF_EXITING))
    err = bt_sock_wait_state(sk, BT_CLOSED,
    sk->sk_lingertime);
    }
    @@ -933,7 +934,8 @@ static int sco_sock_release(struct socket *sock)

    sco_sock_close(sk);

    - if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) {
    + if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime &&
    + !(current->flags & PF_EXITING)) {
    lock_sock(sk);
    err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
    release_sock(sk);
    --
    2.1.0


    \
     
     \ /
      Last update: 2014-09-26 12:41    [W:4.166 / U:0.500 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site