Skip to content

Commit a24ef5b

Browse files
authored
Merge pull request #1436 from apernet/fix-race
fix: race in udpSessionManager cleanup & update code formatting
2 parents b2485e6 + 36370ff commit a24ef5b

File tree

11 files changed

+30
-31
lines changed

11 files changed

+30
-31
lines changed

app/internal/redirect/getsockopt_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ func getsockopt(s, level, name uintptr, val unsafe.Pointer, vallen *uint32) (err
1313
if e != 0 {
1414
err = e
1515
}
16-
return
16+
return err
1717
}

app/internal/redirect/getsockopt_linux_386.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ func getsockopt(s, level, name uintptr, val unsafe.Pointer, vallen *uint32) (err
1919
if e != 0 {
2020
err = e
2121
}
22-
return
22+
return err
2323
}

app/internal/sockopts/sockopts.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,15 @@ func (e *UnsupportedError) Error() string {
4242
func (o *SocketOptions) ListenUDP() (uconn net.PacketConn, err error) {
4343
uconn, err = net.ListenUDP("udp", nil)
4444
if err != nil {
45-
return
45+
return uconn, err
4646
}
4747
err = o.applyToUDPConn(uconn.(*net.UDPConn))
4848
if err != nil {
4949
uconn.Close()
5050
uconn = nil
51-
return
51+
return uconn, err
5252
}
53-
return
53+
return uconn, err
5454
}
5555

5656
func (o *SocketOptions) applyToUDPConn(c *net.UDPConn) error {

app/internal/sockopts/sockopts_linux.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@ func init() {
2424
func controlUDPConn(c *net.UDPConn, cb func(fd int) error) (err error) {
2525
rconn, err := c.SyscallConn()
2626
if err != nil {
27-
return
27+
return err
2828
}
2929
cerr := rconn.Control(func(fd uintptr) {
3030
err = cb(int(fd))
3131
})
3232
if err != nil {
33-
return
33+
return err
3434
}
3535
if cerr != nil {
3636
err = fmt.Errorf("failed to control fd: %w", cerr)
37-
return
37+
return err
3838
}
39-
return
39+
return err
4040
}
4141

4242
func bindInterfaceImpl(c *net.UDPConn, device string) error {

app/internal/sockopts/sockopts_linux_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ func Test_fdControlUnixSocketImpl(t *testing.T) {
4242
err = controlUDPConn(conn.(*net.UDPConn), func(fd int) (err error) {
4343
rcvbuf, err := unix.GetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_RCVBUF)
4444
if err != nil {
45-
return
45+
return err
4646
}
4747
// The test server called setsockopt(fd, SOL_SOCKET, SO_RCVBUF, 2500),
4848
// and kernel will double this value for getsockopt().
4949
assert.Equal(t, 5000, rcvbuf)
50-
return
50+
return err
5151
})
5252
assert.NoError(t, err)
5353
}

app/internal/url/url.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,7 @@ func splitHostPort(hostPort string) (host, port string) {
11731173
host = host[1 : len(host)-1]
11741174
}
11751175

1176-
return
1176+
return host, port
11771177
}
11781178

11791179
// Marshaling interface implementations.
@@ -1263,8 +1263,8 @@ func stringContainsCTLByte(s string) bool {
12631263
func JoinPath(base string, elem ...string) (result string, err error) {
12641264
url, err := Parse(base)
12651265
if err != nil {
1266-
return
1266+
return result, err
12671267
}
12681268
result = url.JoinPath(elem...).String()
1269-
return
1269+
return result, err
12701270
}

app/internal/utils/certloader.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,42 +68,42 @@ func (l *LocalCertificateLoader) checkModTime() (certModTime, keyModTime time.Ti
6868
fi, err := os.Stat(l.CertFile)
6969
if err != nil {
7070
err = fmt.Errorf("failed to stat certificate file: %w", err)
71-
return
71+
return certModTime, keyModTime, err
7272
}
7373
certModTime = fi.ModTime()
7474

7575
fi, err = os.Stat(l.KeyFile)
7676
if err != nil {
7777
err = fmt.Errorf("failed to stat key file: %w", err)
78-
return
78+
return certModTime, keyModTime, err
7979
}
8080
keyModTime = fi.ModTime()
81-
return
81+
return certModTime, keyModTime, err
8282
}
8383

8484
func (l *LocalCertificateLoader) makeCache() (cache *localCertificateCache, err error) {
8585
c := &localCertificateCache{}
8686

8787
c.certModTime, c.keyModTime, err = l.checkModTime()
8888
if err != nil {
89-
return
89+
return cache, err
9090
}
9191

9292
cert, err := tls.LoadX509KeyPair(l.CertFile, l.KeyFile)
9393
if err != nil {
94-
return
94+
return cache, err
9595
}
9696
c.certificate = &cert
9797
if c.certificate.Leaf == nil {
9898
// certificate.Leaf was left nil by tls.LoadX509KeyPair before Go 1.23
9999
c.certificate.Leaf, err = x509.ParseCertificate(cert.Certificate[0])
100100
if err != nil {
101-
return
101+
return cache, err
102102
}
103103
}
104104

105105
cache = c
106-
return
106+
return cache, err
107107
}
108108

109109
func (l *LocalCertificateLoader) getCertificateWithCache() (*tls.Certificate, error) {

core/server/udp.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func newUDPSessionEntry(
6060
ExitFunc: exitFunc,
6161
}
6262

63-
return
63+
return e
6464
}
6565

6666
// CloseWithErr closes the session and calls ExitFunc with the given error.
@@ -259,10 +259,9 @@ func (m *udpSessionManager) idleCleanupLoop(stopCh <-chan struct{}) {
259259
}
260260

261261
func (m *udpSessionManager) cleanup(idleOnly bool) {
262-
timeoutEntry := make([]*udpSessionEntry, 0, len(m.m))
263-
264262
// We use RLock here as we are only scanning the map, not deleting from it.
265263
m.mutex.RLock()
264+
timeoutEntry := make([]*udpSessionEntry, 0, len(m.m))
266265
now := time.Now()
267266
for _, entry := range m.m {
268267
if !idleOnly || now.Sub(entry.Last.Get()) > m.idleTimeout {
@@ -289,14 +288,14 @@ func (m *udpSessionManager) feed(msg *protocol.UDPMessage) {
289288
// Call the hook
290289
err = m.io.Hook(firstMsgData, &addr)
291290
if err != nil {
292-
return
291+
return conn, actualAddr, err
293292
}
294293
actualAddr = addr
295294
// Log the event
296295
m.eventLogger.New(msg.SessionID, addr)
297296
// Dial target
298297
conn, err = m.io.UDP(addr)
299-
return
298+
return conn, actualAddr, err
300299
}
301300
exitFunc := func(err error) {
302301
// Log the event

extras/obfs/conn.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ func (c *obfsPacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
6464
n, addr, err = c.Conn.ReadFrom(c.readBuf)
6565
if n <= 0 {
6666
c.readMutex.Unlock()
67-
return
67+
return n, addr, err
6868
}
6969
n = c.Obfs.Deobfuscate(c.readBuf[:n], p)
7070
c.readMutex.Unlock()
7171
if n > 0 || err != nil {
72-
return
72+
return n, addr, err
7373
}
7474
// Invalid packet, try again
7575
}
@@ -83,7 +83,7 @@ func (c *obfsPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
8383
if err == nil {
8484
n = len(p)
8585
}
86-
return
86+
return n, err
8787
}
8888

8989
func (c *obfsPacketConn) Close() error {

extras/outbounds/ob_socks5.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func addrExToSOCKS5Addr(addr *AddrEx) (atyp byte, dstAddr, dstPort []byte) {
258258
// Port
259259
dstPort = make([]byte, 2)
260260
binary.BigEndian.PutUint16(dstPort, addr.Port)
261-
return
261+
return atyp, dstAddr, dstPort
262262
}
263263

264264
func socks5AddrToAddrEx(atyp byte, dstAddr, dstPort []byte) *AddrEx {

0 commit comments

Comments
 (0)