From 013d1de82ff1a7d0bc73d54a3e7032da710d62bc Mon Sep 17 00:00:00 2001 From: csotelo Date: Wed, 18 Sep 2024 20:47:40 -0400 Subject: [PATCH] Fix data race #26 --- interfaceListener.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/interfaceListener.go b/interfaceListener.go index 19f5d38..abf13a9 100644 --- a/interfaceListener.go +++ b/interfaceListener.go @@ -1,7 +1,11 @@ package GoSNMPServer -import "net" -import "github.com/pkg/errors" +import ( + "net" + "sync" + + "github.com/pkg/errors" +) type ISnmpServerListener interface { SetupLogger(ILogger) @@ -17,6 +21,7 @@ type IReplyer interface { type UDPListener struct { conn *net.UDPConn + mutex sync.RWMutex logger ILogger } @@ -43,19 +48,26 @@ func (udp *UDPListener) Address() net.Addr { } func (udp *UDPListener) NextSnmp() ([]byte, IReplyer, error) { - var msg [4096]byte - if udp.conn == nil { + udp.mutex.RLock() + conn := udp.conn + udp.mutex.RUnlock() + + if conn == nil { return nil, nil, errors.New("Connection Not Listen") } - counts, udpAddr, err := udp.conn.ReadFromUDP(msg[:]) + var msg [4096]byte + counts, udpAddr, err := conn.ReadFromUDP(msg[:]) if err != nil { return nil, nil, errors.Wrap(err, "UDP Read Error") } udp.logger.Infof("udp request from %v. size=%v", udpAddr, counts) - return msg[:counts], &UDPReplyer{udpAddr, udp.conn}, nil + return msg[:counts], &UDPReplyer{udpAddr, conn}, nil } func (udp *UDPListener) Shutdown() { + udp.mutex.Lock() + defer udp.mutex.Unlock() + if udp.conn != nil { udp.conn.Close() udp.conn = nil