From 94ac0504ddcbe4c68018394ef04b3a04994dca98 Mon Sep 17 00:00:00 2001 From: Justin Head Date: Sat, 23 May 2020 13:47:39 -0700 Subject: [PATCH] Fix nil reference & improve client timeout --- internal/clientmap/clientmap.go | 8 +++++--- internal/proxy/proxy.go | 11 +++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/internal/clientmap/clientmap.go b/internal/clientmap/clientmap.go index 49a41f6..a6d5fc2 100644 --- a/internal/clientmap/clientmap.go +++ b/internal/clientmap/clientmap.go @@ -87,9 +87,11 @@ func (cm *ClientMap) Delete(clientAddr net.Addr) { cm.mutex.Lock() - cm.clients[key].conn.Close() - delete(cm.clients, key) - + if client, exists := cm.clients[key]; exists { + client.conn.Close() + delete(cm.clients, key) + } + cm.mutex.Unlock() } diff --git a/internal/proxy/proxy.go b/internal/proxy/proxy.go index ba5c011..9d9e2de 100644 --- a/internal/proxy/proxy.go +++ b/internal/proxy/proxy.go @@ -29,7 +29,7 @@ type ProxyServer struct { clientMap *clientmap.ClientMap prefs ProxyPrefs dead *abool.AtomicBool - serverOffline bool + serverOffline bool } type ProxyPrefs struct { @@ -195,6 +195,9 @@ func (proxy *ProxyServer) processDataFromClients(listener net.PacketConn, packet return err } + // Wait 5 seconds for the server to respond to whatever we sent, or else timeout + _ = serverConn.SetReadDeadline(time.Now().Add(time.Second * 5)) + if packetID := data[0]; packetID == proto.UnconnectedPingID { log.Info().Msgf("Received LAN ping from client: %s", client.String()) @@ -220,12 +223,12 @@ func (proxy *ProxyServer) processDataFromServer(remoteConn *net.UDPConn, client buffer := make([]byte, maxMTU) for !proxy.dead.IsSet() { - // Set a read timeout of 5 seconds - _ = remoteConn.SetReadDeadline(time.Now().Add(time.Second * 5)) - // Read the next packet from the server read, _, err := remoteConn.ReadFrom(buffer) + // Remove read timeout, server responded + _ = remoteConn.SetReadDeadline(time.Time{}) + // Read error if err != nil { log.Warn().Msgf("%v", err)