summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/tcp/endpoint.go
diff options
context:
space:
mode:
authorTamir Duberstein <tamird@google.com>2019-07-23 12:09:15 -0700
committergVisor bot <gvisor-bot@google.com>2019-07-23 12:10:18 -0700
commit12c256568ba784c07cf73822359faac2971e8306 (patch)
treed426604aa70260ba078460b2c5b4816e713de95f /pkg/tcpip/transport/tcp/endpoint.go
parent5ddf9adb2b12a2cbccdcf609c5cc140fa0dbd81d (diff)
Deduplicate EndpointState.connected some
This fixes a bug introduced in cl/251934850 that caused connect-accept-close-connect races to result in the second connect call failiing when it should have succeeded. PiperOrigin-RevId: 259584525
Diffstat (limited to 'pkg/tcpip/transport/tcp/endpoint.go')
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go24
1 files changed, 13 insertions, 11 deletions
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index 89154391b..cc49c8272 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -489,8 +489,8 @@ func (e *endpoint) Readiness(mask waiter.EventMask) waiter.EventMask {
result |= waiter.EventIn
}
}
-
- case StateEstablished, StateFinWait1, StateFinWait2, StateTimeWait, StateCloseWait, StateLastAck, StateClosing:
+ }
+ if e.state.connected() {
// Determine if the endpoint is writable if requested.
if (mask & waiter.EventOut) != 0 {
e.sndBufMu.Lock()
@@ -1323,6 +1323,17 @@ func (e *endpoint) connect(addr tcpip.FullAddress, handshake bool, run bool) (er
return err
}
+ if e.state.connected() {
+ // The endpoint is already connected. If caller hasn't been
+ // notified yet, return success.
+ if !e.isConnectNotified {
+ e.isConnectNotified = true
+ return nil
+ }
+ // Otherwise return that it's already connected.
+ return tcpip.ErrAlreadyConnected
+ }
+
nicid := addr.NIC
switch e.state {
case StateBound:
@@ -1347,15 +1358,6 @@ func (e *endpoint) connect(addr tcpip.FullAddress, handshake bool, run bool) (er
// yet.
return tcpip.ErrAlreadyConnecting
- case StateEstablished:
- // The endpoint is already connected. If caller hasn't been notified yet, return success.
- if !e.isConnectNotified {
- e.isConnectNotified = true
- return nil
- }
- // Otherwise return that it's already connected.
- return tcpip.ErrAlreadyConnected
-
case StateError:
return e.hardError