Conn: fixed double mutex lock in SetDeadline

This commit is contained in:
ddirect
2025-11-30 16:51:42 +02:00
parent f6bc73ee6c
commit 6f3da983b0
+14 -4
View File
@@ -246,7 +246,7 @@ func (conn *Conn) checkPipeOpen() error {
if conn.abortErr != nil { if conn.abortErr != nil {
return conn.abortErr return conn.abortErr
} }
state := conn.State() state := conn.h.State()
if state.IsClosed() { if state.IsClosed() {
return net.ErrClosed return net.ErrClosed
} }
@@ -332,11 +332,11 @@ func (conn *Conn) reset(h Handler) {
func (conn *Conn) SetDeadline(t time.Time) error { func (conn *Conn) SetDeadline(t time.Time) error {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() defer conn.mu.Unlock()
err := conn.SetReadDeadline(t) err := conn.setReadDeadline(t)
if err != nil { if err != nil {
return err return err
} }
return conn.SetWriteDeadline(t) return conn.setWriteDeadline(t)
} }
// SetReadDeadline sets the deadline for future Read calls // 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 { func (conn *Conn) SetReadDeadline(t time.Time) error {
conn.mu.Lock() conn.mu.Lock()
defer conn.mu.Unlock() 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() err := conn.checkPipeOpen()
if err == nil { if err == nil {
conn.rdead = t conn.rdead = t
@@ -358,6 +362,12 @@ func (conn *Conn) SetReadDeadline(t time.Time) error {
// some of the data was successfully written. // some of the data was successfully written.
// A zero value for t means Write will not time out. // A zero value for t means Write will not time out.
func (conn *Conn) SetWriteDeadline(t time.Time) error { 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") conn.trace("TCPConn.SetWriteDeadline:start")
err := conn.checkPipeOpen() err := conn.checkPipeOpen()
if err == nil { if err == nil {