diff options
Diffstat (limited to 'net/phonet')
-rw-r--r-- | net/phonet/pep.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index af4d38bc3b22..94d72e85a475 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
@@ -626,6 +626,7 @@ static void pep_sock_close(struct sock *sk, long timeout) | |||
626 | struct pep_sock *pn = pep_sk(sk); | 626 | struct pep_sock *pn = pep_sk(sk); |
627 | int ifindex = 0; | 627 | int ifindex = 0; |
628 | 628 | ||
629 | sock_hold(sk); /* keep a reference after sk_common_release() */ | ||
629 | sk_common_release(sk); | 630 | sk_common_release(sk); |
630 | 631 | ||
631 | lock_sock(sk); | 632 | lock_sock(sk); |
@@ -644,6 +645,7 @@ static void pep_sock_close(struct sock *sk, long timeout) | |||
644 | 645 | ||
645 | if (ifindex) | 646 | if (ifindex) |
646 | gprs_detach(sk); | 647 | gprs_detach(sk); |
648 | sock_put(sk); | ||
647 | } | 649 | } |
648 | 650 | ||
649 | static int pep_wait_connreq(struct sock *sk, int noblock) | 651 | static int pep_wait_connreq(struct sock *sk, int noblock) |
@@ -1043,12 +1045,12 @@ static void pep_sock_unhash(struct sock *sk) | |||
1043 | lock_sock(sk); | 1045 | lock_sock(sk); |
1044 | if ((1 << sk->sk_state) & ~(TCPF_CLOSE|TCPF_LISTEN)) { | 1046 | if ((1 << sk->sk_state) & ~(TCPF_CLOSE|TCPF_LISTEN)) { |
1045 | skparent = pn->listener; | 1047 | skparent = pn->listener; |
1046 | sk_del_node_init(sk); | ||
1047 | release_sock(sk); | 1048 | release_sock(sk); |
1048 | 1049 | ||
1049 | sk = skparent; | ||
1050 | pn = pep_sk(skparent); | 1050 | pn = pep_sk(skparent); |
1051 | lock_sock(sk); | 1051 | lock_sock(skparent); |
1052 | sk_del_node_init(sk); | ||
1053 | sk = skparent; | ||
1052 | } | 1054 | } |
1053 | /* Unhash a listening sock only when it is closed | 1055 | /* Unhash a listening sock only when it is closed |
1054 | * and all of its active connected pipes are closed. */ | 1056 | * and all of its active connected pipes are closed. */ |