|
@@ -1279,6 +1279,7 @@ out:
|
|
|
static int pppol2tp_release(struct socket *sock)
|
|
|
{
|
|
|
struct sock *sk = sock->sk;
|
|
|
+ struct pppol2tp_session *session;
|
|
|
int error;
|
|
|
|
|
|
if (!sk)
|
|
@@ -1296,9 +1297,18 @@ static int pppol2tp_release(struct socket *sock)
|
|
|
sock_orphan(sk);
|
|
|
sock->sk = NULL;
|
|
|
|
|
|
+ session = pppol2tp_sock_to_session(sk);
|
|
|
+
|
|
|
/* Purge any queued data */
|
|
|
skb_queue_purge(&sk->sk_receive_queue);
|
|
|
skb_queue_purge(&sk->sk_write_queue);
|
|
|
+ if (session != NULL) {
|
|
|
+ struct sk_buff *skb;
|
|
|
+ while ((skb = skb_dequeue(&session->reorder_q))) {
|
|
|
+ kfree_skb(skb);
|
|
|
+ sock_put(sk);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
release_sock(sk);
|
|
|
|