1 From foo@baz Sat Jan 5 08:30:28 CET 2019
2 From: Jorgen Hansen <jhansen@vmware.com>
3 Date: Tue, 18 Dec 2018 00:34:06 -0800
4 Subject: VSOCK: Send reset control packet when socket is partially bound
6 From: Jorgen Hansen <jhansen@vmware.com>
8 [ Upstream commit a915b982d8f5e4295f64b8dd37ce753874867e88 ]
10 If a server side socket is bound to an address, but not in the listening
11 state yet, incoming connection requests should receive a reset control
12 packet in response. However, the function used to send the reset
13 silently drops the reset packet if the sending socket isn't bound
14 to a remote address (as is the case for a bound socket not yet in
15 the listening state). This change fixes this by using the src
16 of the incoming packet as destination for the reset packet in
19 Fixes: d021c344051a ("VSOCK: Introduce VM Sockets")
20 Reviewed-by: Adit Ranadive <aditr@vmware.com>
21 Reviewed-by: Vishnu Dasa <vdasa@vmware.com>
22 Signed-off-by: Jorgen Hansen <jhansen@vmware.com>
23 Signed-off-by: David S. Miller <davem@davemloft.net>
24 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
26 net/vmw_vsock/vmci_transport.c | 67 ++++++++++++++++++++++++++++++-----------
27 1 file changed, 50 insertions(+), 17 deletions(-)
29 --- a/net/vmw_vsock/vmci_transport.c
30 +++ b/net/vmw_vsock/vmci_transport.c
31 @@ -273,6 +273,31 @@ vmci_transport_send_control_pkt_bh(struc
35 +vmci_transport_alloc_send_control_pkt(struct sockaddr_vm *src,
36 + struct sockaddr_vm *dst,
37 + enum vmci_transport_packet_type type,
40 + struct vmci_transport_waiting_info *wait,
42 + struct vmci_handle handle)
44 + struct vmci_transport_packet *pkt;
47 + pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
51 + err = __vmci_transport_send_control_pkt(pkt, src, dst, type, size,
52 + mode, wait, proto, handle,
60 vmci_transport_send_control_pkt(struct sock *sk,
61 enum vmci_transport_packet_type type,
63 @@ -281,9 +306,7 @@ vmci_transport_send_control_pkt(struct s
65 struct vmci_handle handle)
67 - struct vmci_transport_packet *pkt;
68 struct vsock_sock *vsk;
73 @@ -293,17 +316,10 @@ vmci_transport_send_control_pkt(struct s
74 if (!vsock_addr_bound(&vsk->remote_addr))
77 - pkt = kmalloc(sizeof(*pkt), GFP_KERNEL);
81 - err = __vmci_transport_send_control_pkt(pkt, &vsk->local_addr,
82 - &vsk->remote_addr, type, size,
83 - mode, wait, proto, handle,
88 + return vmci_transport_alloc_send_control_pkt(&vsk->local_addr,
91 + wait, proto, handle);
94 static int vmci_transport_send_reset_bh(struct sockaddr_vm *dst,
95 @@ -321,12 +337,29 @@ static int vmci_transport_send_reset_bh(
96 static int vmci_transport_send_reset(struct sock *sk,
97 struct vmci_transport_packet *pkt)
99 + struct sockaddr_vm *dst_ptr;
100 + struct sockaddr_vm dst;
101 + struct vsock_sock *vsk;
103 if (pkt->type == VMCI_TRANSPORT_PACKET_TYPE_RST)
105 - return vmci_transport_send_control_pkt(sk,
106 - VMCI_TRANSPORT_PACKET_TYPE_RST,
107 - 0, 0, NULL, VSOCK_PROTO_INVALID,
108 - VMCI_INVALID_HANDLE);
110 + vsk = vsock_sk(sk);
112 + if (!vsock_addr_bound(&vsk->local_addr))
115 + if (vsock_addr_bound(&vsk->remote_addr)) {
116 + dst_ptr = &vsk->remote_addr;
118 + vsock_addr_init(&dst, pkt->dg.src.context,
122 + return vmci_transport_alloc_send_control_pkt(&vsk->local_addr, dst_ptr,
123 + VMCI_TRANSPORT_PACKET_TYPE_RST,
124 + 0, 0, NULL, VSOCK_PROTO_INVALID,
125 + VMCI_INVALID_HANDLE);
128 static int vmci_transport_send_negotiate(struct sock *sk, size_t size)