]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/vmw_vsock/virtio_transport_common.c
vsock/virtio: fix sock refcnt holding during the shutdown
[mirror_ubuntu-bionic-kernel.git] / net / vmw_vsock / virtio_transport_common.c
index 3c199f752fd3c926d5a4937a63d6f7513e25bdd2..2a8651aa90c89e5f8ddfac8f167b20438dab42fd 100644 (file)
@@ -871,9 +871,11 @@ virtio_transport_recv_connected(struct sock *sk,
                if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SHUTDOWN_SEND)
                        vsk->peer_shutdown |= SEND_SHUTDOWN;
                if (vsk->peer_shutdown == SHUTDOWN_MASK &&
-                   vsock_stream_has_data(vsk) <= 0) {
-                       sock_set_flag(sk, SOCK_DONE);
-                       sk->sk_state = TCP_CLOSING;
+                   vsock_stream_has_data(vsk) <= 0 &&
+                   !sock_flag(sk, SOCK_DONE)) {
+                       (void)virtio_transport_reset(vsk, NULL);
+
+                       virtio_transport_do_close(vsk, true);
                }
                if (le32_to_cpu(pkt->hdr.flags))
                        sk->sk_state_change(sk);