|
@@ -189,6 +189,7 @@ static int llc_ui_release(struct socket *sock)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
struct llc_sock *llc;
|
|
|
+ struct llc_sap *sap;
|
|
|
|
|
|
if (unlikely(sk == NULL))
|
|
|
goto out;
|
|
@@ -199,9 +200,15 @@ static int llc_ui_release(struct socket *sock)
|
|
|
llc->laddr.lsap, llc->daddr.lsap);
|
|
|
if (!llc_send_disc(sk))
|
|
|
llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
|
|
|
+ sap = llc->sap;
|
|
|
+ /* Hold this for release_sock(), so that llc_backlog_rcv() could still
|
|
|
+ * use it.
|
|
|
+ */
|
|
|
+ llc_sap_hold(sap);
|
|
|
if (!sock_flag(sk, SOCK_ZAPPED))
|
|
|
llc_sap_remove_socket(llc->sap, sk);
|
|
|
release_sock(sk);
|
|
|
+ llc_sap_put(sap);
|
|
|
if (llc->dev)
|
|
|
dev_put(llc->dev);
|
|
|
sock_put(sk);
|