From 4598faecd57b371f91e09dd44c1b86696f40a9be Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Sun, 23 Aug 2026 00:24:21 -0700 Subject: [PATCH] fix(session): guard promoted Connection methods against nil after gc Signed-off-by: Sai Asish Y --- transport/session.go | 44 +++++++++++++++++++++++++++++++++++++++ transport/session_test.go | 19 +++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/transport/session.go b/transport/session.go index eddddec..9df77db 100644 --- a/transport/session.go +++ b/transport/session.go @@ -1267,3 +1267,47 @@ func (s *session) SetSession(ss Session) { } s.lock.RUnlock() } + +func (s *session) SetReadTimeout(rTimeout time.Duration) { + if s == nil { + return + } + s.lock.RLock() + defer s.lock.RUnlock() + if s.Connection != nil { + s.Connection.SetReadTimeout(rTimeout) + } +} + +func (s *session) SetWriteTimeout(wTimeout time.Duration) { + if s == nil { + return + } + s.lock.RLock() + defer s.lock.RUnlock() + if s.Connection != nil { + s.Connection.SetWriteTimeout(wTimeout) + } +} + +func (s *session) SetCompressType(c CompressType) { + if s == nil { + return + } + s.lock.RLock() + defer s.lock.RUnlock() + if s.Connection != nil { + s.Connection.SetCompressType(c) + } +} + +func (s *session) CloseConn(waitSec int) { + if s == nil { + return + } + s.lock.RLock() + defer s.lock.RUnlock() + if s.Connection != nil { + s.Connection.CloseConn(waitSec) + } +} diff --git a/transport/session_test.go b/transport/session_test.go index 25b6b5a..e43e9b9 100644 --- a/transport/session_test.go +++ b/transport/session_test.go @@ -501,3 +501,22 @@ func TestHandlePackageWithNilListenerDoesNotPanicOnError(t *testing.T) { ss.handlePackage() } + +// Regression test for #122: promoted Connection methods must not panic after +// the session has cleared its embedded Connection via gc(). +func TestSetMethodsAfterGCDoNotPanic(t *testing.T) { + c1, c2 := net.Pipe() + defer c1.Close() + defer c2.Close() + + ss := newTCPSession(c1, newServer(TCP_SERVER)).(*session) + ss.gc() + if ss.Connection != nil { + t.Fatal("gc did not clear the session connection") + } + + ss.SetReadTimeout(time.Second) + ss.SetWriteTimeout(time.Second) + ss.SetCompressType(CompressZip) + ss.CloseConn(0) +}