When the socket is released, we should free all packets
queued in the per-socket list in order to avoid a memory
leak.

Signed-off-by: Stefano Garzarella <[email protected]>
---
 net/vmw_vsock/virtio_transport_common.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/net/vmw_vsock/virtio_transport_common.c 
b/net/vmw_vsock/virtio_transport_common.c
index 0248d6808755..65c8b4a23f2b 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -827,12 +827,20 @@ static bool virtio_transport_close(struct vsock_sock *vsk)
 
 void virtio_transport_release(struct vsock_sock *vsk)
 {
+       struct virtio_vsock_sock *vvs = vsk->trans;
+       struct virtio_vsock_buf *buf;
        struct sock *sk = &vsk->sk;
        bool remove_sock = true;
 
        lock_sock(sk);
        if (sk->sk_type == SOCK_STREAM)
                remove_sock = virtio_transport_close(vsk);
+       while (!list_empty(&vvs->rx_queue)) {
+               buf = list_first_entry(&vvs->rx_queue,
+                                      struct virtio_vsock_buf, list);
+               list_del(&buf->list);
+               virtio_transport_free_buf(buf);
+       }
        release_sock(sk);
 
        if (remove_sock)
-- 
2.20.1

_______________________________________________
Virtualization mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to