From 27bf9746b5eb8ea09f099b219bcafc92ee8e7e2d Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Sat, 29 Mar 2025 20:56:36 +0100
Subject: [PATCH] use mutex when accessing obfs4Conns in order to avoid race
 conditions

---
 client/client.go | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/client/client.go b/client/client.go
index 70bce4b..9758cbd 100644
--- a/client/client.go
+++ b/client/client.go
@@ -419,21 +419,25 @@ func (c *Client) readUDPWriteTCP() {
 			c.error("readUDPWriteTCP: Write err from %v to %v: %v", conn.LocalAddr(), conn.RemoteAddr(), err)
 			cancelled := cancellableSleep(c.ctx, reconnectTime)
 			if !cancelled {
-				config := c.obfs4Conns[0].config
+				conn, err = c.getUsableConnection()
+				if err != nil {
+					return
+				}
+				config := conn.config
 				c.connectObfs4(&config, 20)
 			}
 		}
 	}
 }
 
-func (c *Client) getUsableConnection() (net.Conn, error) {
+func (c *Client) getUsableConnection() (*Obfs4Conn, error) {
 	c.outLock.Lock()
 	defer c.outLock.Unlock()
 
 	if len(c.obfs4Conns) == 0 {
 		return nil, errors.New("no usable connection")
 	} else {
-		return c.obfs4Conns[0], nil
+		return &c.obfs4Conns[0], nil
 	}
 }
 
-- 
GitLab