From c327b2ec7250c9d4626f2940f7a8debbecb571b4 Mon Sep 17 00:00:00 2001 From: Russ Magee Date: Thu, 27 Jun 2019 01:19:52 -0700 Subject: [PATCH] Fixed tun reuse hang/error after closure Signed-off-by: Russ Magee --- hkexnet/hkextun.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hkexnet/hkextun.go b/hkexnet/hkextun.go index 6503c3f..87ef049 100644 --- a/hkexnet/hkextun.go +++ b/hkexnet/hkextun.go @@ -157,6 +157,7 @@ func (hc *Conn) StartClientTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } else if strings.Contains(e.Error(), "i/o timeout") { if (*hc.tuns)[rport].Died { @@ -165,6 +166,7 @@ func (hc *Conn) StartClientTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } } else { @@ -177,6 +179,7 @@ func (hc *Conn) StartClientTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } } @@ -253,6 +256,10 @@ func (hc *Conn) StartServerTunnel(lport, rport uint16) { defer wg.Done() for { time.Sleep(100 * time.Millisecond) + if (*hc.tuns)[rport] == nil { + logger.LogDebug("[ServerTun] worker A: Client endpoint removed.") + break + } (*hc.tuns)[rport].KeepAlive += 1 if (*hc.tuns)[rport].KeepAlive > 25 { (*hc.tuns)[rport].Died = true @@ -320,6 +327,7 @@ func (hc *Conn) StartServerTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } else if strings.Contains(e.Error(), "i/o timeout") { if (*hc.tuns)[rport].Died { @@ -328,6 +336,7 @@ func (hc *Conn) StartServerTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } } else { @@ -340,6 +349,7 @@ func (hc *Conn) StartServerTunnel(lport, rport uint16) { close((*hc.tuns)[rport].Data) (*hc.tuns)[rport].Data = nil } + delete((*hc.tuns), rport) break } }