| From foo@baz Wed 22 May 2019 06:53:31 PM CEST |
| From: Stefano Garzarella <sgarzare@redhat.com> |
| Date: Fri, 17 May 2019 16:45:43 +0200 |
| Subject: vsock/virtio: free packets during the socket release |
| |
| From: Stefano Garzarella <sgarzare@redhat.com> |
| |
| [ Upstream commit ac03046ece2b158ebd204dfc4896fd9f39f0e6c8 ] |
| |
| 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 <sgarzare@redhat.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/vmw_vsock/virtio_transport_common.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/net/vmw_vsock/virtio_transport_common.c |
| +++ b/net/vmw_vsock/virtio_transport_common.c |
| @@ -725,12 +725,19 @@ static bool virtio_transport_close(struc |
| |
| void virtio_transport_release(struct vsock_sock *vsk) |
| { |
| + struct virtio_vsock_sock *vvs = vsk->trans; |
| + struct virtio_vsock_pkt *pkt, *tmp; |
| struct sock *sk = &vsk->sk; |
| bool remove_sock = true; |
| |
| lock_sock(sk); |
| if (sk->sk_type == SOCK_STREAM) |
| remove_sock = virtio_transport_close(vsk); |
| + |
| + list_for_each_entry_safe(pkt, tmp, &vvs->rx_queue, list) { |
| + list_del(&pkt->list); |
| + virtio_transport_free_pkt(pkt); |
| + } |
| release_sock(sk); |
| |
| if (remove_sock) |