diff options
author | Tamir Duberstein <tamird@google.com> | 2019-07-23 12:09:15 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-07-23 12:10:18 -0700 |
commit | 12c256568ba784c07cf73822359faac2971e8306 (patch) | |
tree | d426604aa70260ba078460b2c5b4816e713de95f /pkg/tcpip/transport/tcp/endpoint.go | |
parent | 5ddf9adb2b12a2cbccdcf609c5cc140fa0dbd81d (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.go | 24 |
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 |