diff --git a/common/control/bind_finder_default.go b/common/control/bind_finder_default.go index 2c16f318..e8eab92b 100644 --- a/common/control/bind_finder_default.go +++ b/common/control/bind_finder_default.go @@ -3,6 +3,7 @@ package control import ( "net" "net/netip" + "sync" E "github.com/sagernet/sing/common/exceptions" ) @@ -11,6 +12,7 @@ var _ InterfaceFinder = (*DefaultInterfaceFinder)(nil) type DefaultInterfaceFinder struct { interfaces []Interface + access sync.RWMutex } func NewDefaultInterfaceFinder() *DefaultInterfaceFinder { @@ -31,7 +33,9 @@ func (f *DefaultInterfaceFinder) Update() error { } interfaces = append(interfaces, iif) } + f.access.Lock() f.interfaces = interfaces + f.access.Unlock() return nil } @@ -61,11 +65,14 @@ func (f *DefaultInterfaceFinder) ByName(name string) (*Interface, error) { } func (f *DefaultInterfaceFinder) ByIndex(index int) (*Interface, error) { + f.access.RLock() for _, netInterface := range f.interfaces { if netInterface.Index == index { return &netInterface, nil } } + f.access.RUnlock() + _, err := net.InterfaceByIndex(index) if err == nil { err = f.Update() diff --git a/common/udpnat2/conn.go b/common/udpnat2/conn.go index bee64ae0..2aadd8dd 100644 --- a/common/udpnat2/conn.go +++ b/common/udpnat2/conn.go @@ -58,6 +58,9 @@ func (c *natConn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error } func (c *natConn) InitializeReadWaiter(options N.ReadWaitOptions) (needCopy bool) { + c.handlerAccess.Lock() + defer c.handlerAccess.Unlock() + c.readWaitOptions = options return false } diff --git a/common/udpnat2/service.go b/common/udpnat2/service.go index 3367bd7a..4d278de7 100644 --- a/common/udpnat2/service.go +++ b/common/udpnat2/service.go @@ -70,11 +70,11 @@ func (s *Service) NewPacket(bufferSlices [][]byte, source M.Socksaddr, destinati if !ok { return } + conn.handlerAccess.RLock() buffer := conn.readWaitOptions.NewPacketBuffer() for _, bufferSlice := range bufferSlices { buffer.Write(bufferSlice) } - conn.handlerAccess.RLock() handler := conn.handler conn.handlerAccess.RUnlock() if handler != nil {