summaryrefslogtreecommitdiffhomepage
path: root/pkg
diff options
context:
space:
mode:
authorZhaozhong Ni <nzz@google.com>2019-01-14 13:32:31 -0800
committerShentubot <shentubot@google.com>2019-01-14 13:33:47 -0800
commit7182b9cf52087bc354104ad2a23fcf4c468ab20e (patch)
treebbe47c49e9d84fd7a3b0893df12926f1c3ffafd4 /pkg
parent003eedea1c66d3ff07b28accb46bbe9abfa8c89c (diff)
netstack: release port inline for listening sockets only.
PiperOrigin-RevId: 229243918 Change-Id: Ie14ef34e66ae851ed080f57b7d26a369a66f7664
Diffstat (limited to 'pkg')
-rw-r--r--pkg/tcpip/transport/tcp/endpoint.go22
1 files changed, 14 insertions, 8 deletions
diff --git a/pkg/tcpip/transport/tcp/endpoint.go b/pkg/tcpip/transport/tcp/endpoint.go
index 5281f8be2..1ee9f8d25 100644
--- a/pkg/tcpip/transport/tcp/endpoint.go
+++ b/pkg/tcpip/transport/tcp/endpoint.go
@@ -410,18 +410,18 @@ func (e *endpoint) Close() {
e.mu.Lock()
- // We always release ports inline so that they are immediately available
- // for reuse after Close() is called. If also registered, it means this
- // is a listening socket, so we must unregister as well otherwise the
- // next user would fail in Listen() when trying to register.
- if e.isPortReserved {
- e.stack.ReleasePort(e.effectiveNetProtos, ProtocolNumber, e.id.LocalAddress, e.id.LocalPort)
- e.isPortReserved = false
-
+ // For listening sockets, we always release ports inline so that they
+ // are immediately available for reuse after Close() is called. If also
+ // registered, we unregister as well otherwise the next user would fail
+ // in Listen() when trying to register.
+ if e.state == stateListen && e.isPortReserved {
if e.isRegistered {
e.stack.UnregisterTransportEndpoint(e.boundNICID, e.effectiveNetProtos, ProtocolNumber, e.id, e)
e.isRegistered = false
}
+
+ e.stack.ReleasePort(e.effectiveNetProtos, ProtocolNumber, e.id.LocalAddress, e.id.LocalPort)
+ e.isPortReserved = false
}
// Either perform the local cleanup or kick the worker to make sure it
@@ -457,6 +457,12 @@ func (e *endpoint) cleanupLocked() {
if e.isRegistered {
e.stack.UnregisterTransportEndpoint(e.boundNICID, e.effectiveNetProtos, ProtocolNumber, e.id, e)
+ e.isRegistered = false
+ }
+
+ if e.isPortReserved {
+ e.stack.ReleasePort(e.effectiveNetProtos, ProtocolNumber, e.id.LocalAddress, e.id.LocalPort)
+ e.isPortReserved = false
}
e.route.Release()