summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/tcp/endpoint.go
diff options
context:
space:
mode:
authorBhasker Hariharan <bhaskerh@google.com>2020-01-15 13:20:14 -0800
committergVisor bot <gvisor-bot@google.com>2020-01-15 13:21:50 -0800
commit275ac8ce1debf89a22eb1150df3bf9ba7a0bc9ba (patch)
tree3f96c3a08e2cc4fb100d70e4c5f56251508f55d4 /pkg/tcpip/transport/tcp/endpoint.go
parentf874723e64bd8a2e747bb336e0b6b8f0da1f044a (diff)
Bugfix to terminate the protocol loop on StateError.
The change to introduce worker goroutines can cause the endpoint to transition to StateError and we should terminate the loop rather than let the endpoint transition to a CLOSED state as we do in case the endpoint enters TIME-WAIT/CLOSED. Moving to a closed state would cause the actual error to not be propagated to any read() calls etc. PiperOrigin-RevId: 289923568
Diffstat (limited to 'pkg/tcpip/transport/tcp/endpoint.go')
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go7
1 files changed, 1 insertions, 6 deletions
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index 1799c6e10..4797f11d1 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -2019,18 +2019,13 @@ func (e *endpoint) Shutdown(flags tcpip.ShutdownFlags) *tcpip.Error {
// If we're fully closed and we have unread data we need to abort
// the connection with a RST.
if (e.shutdownFlags&tcpip.ShutdownWrite) != 0 && rcvBufUsed > 0 {
- // Move the socket to error state immediately.
- // This is done redundantly because in case of
- // save/restore on a Shutdown/Close() the socket
- // state needs to indicate the error otherwise
- // save file will show the socket in established
- // state even though snd/rcv are closed.
e.mu.Unlock()
// Try to send an active reset immediately if the
// work mutex is available.
if e.workMu.TryLock() {
e.mu.Lock()
e.resetConnectionLocked(tcpip.ErrConnectionAborted)
+ e.notifyProtocolGoroutine(notifyTickleWorker)
e.mu.Unlock()
e.workMu.Unlock()
} else {