From 6f3da983b0a9fe22e29c288bb2a2583d4b903e22 Mon Sep 17 00:00:00 2001 From: ddirect <62487612+ddirect@users.noreply.github.com> Date: Sun, 30 Nov 2025 16:51:42 +0200 Subject: [PATCH] Conn: fixed double mutex lock in SetDeadline --- tcp/conn.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tcp/conn.go b/tcp/conn.go index 3dff2db..c7577d6 100644 --- a/tcp/conn.go +++ b/tcp/conn.go @@ -246,7 +246,7 @@ func (conn *Conn) checkPipeOpen() error { if conn.abortErr != nil { return conn.abortErr } - state := conn.State() + state := conn.h.State() if state.IsClosed() { return net.ErrClosed } @@ -332,11 +332,11 @@ func (conn *Conn) reset(h Handler) { func (conn *Conn) SetDeadline(t time.Time) error { conn.mu.Lock() defer conn.mu.Unlock() - err := conn.SetReadDeadline(t) + err := conn.setReadDeadline(t) if err != nil { return err } - return conn.SetWriteDeadline(t) + return conn.setWriteDeadline(t) } // SetReadDeadline sets the deadline for future Read calls @@ -344,7 +344,11 @@ func (conn *Conn) SetDeadline(t time.Time) error { func (conn *Conn) SetReadDeadline(t time.Time) error { conn.mu.Lock() defer conn.mu.Unlock() - conn.trace("TCPConn.SetReadDeadline:start") + return conn.setReadDeadline(t) +} + +func (conn *Conn) setReadDeadline(t time.Time) error { + conn.trace("TCPConn.setReadDeadline:start") err := conn.checkPipeOpen() if err == nil { conn.rdead = t @@ -358,6 +362,12 @@ func (conn *Conn) SetReadDeadline(t time.Time) error { // some of the data was successfully written. // A zero value for t means Write will not time out. func (conn *Conn) SetWriteDeadline(t time.Time) error { + conn.mu.Lock() + defer conn.mu.Unlock() + return conn.setWriteDeadline(t) +} + +func (conn *Conn) setWriteDeadline(t time.Time) error { conn.trace("TCPConn.SetWriteDeadline:start") err := conn.checkPipeOpen() if err == nil {