diff options
Diffstat (limited to 'net/l2tp/l2tp_ppp.c')
-rw-r--r-- | net/l2tp/l2tp_ppp.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index 1ad18c55064c..8ab9c5d74416 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -467,6 +467,10 @@ static void pppol2tp_session_close(struct l2tp_session *session) | |||
467 | static void pppol2tp_session_destruct(struct sock *sk) | 467 | static void pppol2tp_session_destruct(struct sock *sk) |
468 | { | 468 | { |
469 | struct l2tp_session *session = sk->sk_user_data; | 469 | struct l2tp_session *session = sk->sk_user_data; |
470 | |||
471 | skb_queue_purge(&sk->sk_receive_queue); | ||
472 | skb_queue_purge(&sk->sk_write_queue); | ||
473 | |||
470 | if (session) { | 474 | if (session) { |
471 | sk->sk_user_data = NULL; | 475 | sk->sk_user_data = NULL; |
472 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); | 476 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); |
@@ -505,9 +509,6 @@ static int pppol2tp_release(struct socket *sock) | |||
505 | l2tp_session_queue_purge(session); | 509 | l2tp_session_queue_purge(session); |
506 | sock_put(sk); | 510 | sock_put(sk); |
507 | } | 511 | } |
508 | skb_queue_purge(&sk->sk_receive_queue); | ||
509 | skb_queue_purge(&sk->sk_write_queue); | ||
510 | |||
511 | release_sock(sk); | 512 | release_sock(sk); |
512 | 513 | ||
513 | /* This will delete the session context via | 514 | /* This will delete the session context via |
@@ -1574,7 +1575,7 @@ static void pppol2tp_next_tunnel(struct net *net, struct pppol2tp_seq_data *pd) | |||
1574 | 1575 | ||
1575 | static void pppol2tp_next_session(struct net *net, struct pppol2tp_seq_data *pd) | 1576 | static void pppol2tp_next_session(struct net *net, struct pppol2tp_seq_data *pd) |
1576 | { | 1577 | { |
1577 | pd->session = l2tp_session_find_nth(pd->tunnel, pd->session_idx); | 1578 | pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx, true); |
1578 | pd->session_idx++; | 1579 | pd->session_idx++; |
1579 | 1580 | ||
1580 | if (pd->session == NULL) { | 1581 | if (pd->session == NULL) { |
@@ -1701,10 +1702,14 @@ static int pppol2tp_seq_show(struct seq_file *m, void *v) | |||
1701 | 1702 | ||
1702 | /* Show the tunnel or session context. | 1703 | /* Show the tunnel or session context. |
1703 | */ | 1704 | */ |
1704 | if (pd->session == NULL) | 1705 | if (!pd->session) { |
1705 | pppol2tp_seq_tunnel_show(m, pd->tunnel); | 1706 | pppol2tp_seq_tunnel_show(m, pd->tunnel); |
1706 | else | 1707 | } else { |
1707 | pppol2tp_seq_session_show(m, pd->session); | 1708 | pppol2tp_seq_session_show(m, pd->session); |
1709 | if (pd->session->deref) | ||
1710 | pd->session->deref(pd->session); | ||
1711 | l2tp_session_dec_refcount(pd->session); | ||
1712 | } | ||
1708 | 1713 | ||
1709 | out: | 1714 | out: |
1710 | return 0; | 1715 | return 0; |
@@ -1863,4 +1868,4 @@ MODULE_DESCRIPTION("PPP over L2TP over UDP"); | |||
1863 | MODULE_LICENSE("GPL"); | 1868 | MODULE_LICENSE("GPL"); |
1864 | MODULE_VERSION(PPPOL2TP_DRV_VERSION); | 1869 | MODULE_VERSION(PPPOL2TP_DRV_VERSION); |
1865 | MODULE_ALIAS("pppox-proto-" __stringify(PX_PROTO_OL2TP)); | 1870 | MODULE_ALIAS("pppox-proto-" __stringify(PX_PROTO_OL2TP)); |
1866 | MODULE_ALIAS_L2TP_PWTYPE(11); | 1871 | MODULE_ALIAS_L2TP_PWTYPE(7); |