|
@@ -970,7 +970,8 @@ static int sco_sock_shutdown(struct socket *sock, int how)
|
|
sco_sock_clear_timer(sk);
|
|
sco_sock_clear_timer(sk);
|
|
__sco_sock_close(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,
|
|
err = bt_sock_wait_state(sk, BT_CLOSED,
|
|
sk->sk_lingertime);
|
|
sk->sk_lingertime);
|
|
}
|
|
}
|
|
@@ -990,7 +991,8 @@ static int sco_sock_release(struct socket *sock)
|
|
|
|
|
|
sco_sock_close(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)) {
|
|
lock_sock(sk);
|
|
lock_sock(sk);
|
|
err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
|
|
err = bt_sock_wait_state(sk, BT_CLOSED, sk->sk_lingertime);
|
|
release_sock(sk);
|
|
release_sock(sk);
|