feat: enhance SecureConnection Close method for safety and idempotency

Kim committed Nov 13, 2025 at 19:12 UTC 529c9b3735a67e239de59af7d33515481e1eef12
1 file changed +12 -5
portal/core/cryptoops/handshaker.go
+12 -5
@@ -109,6 +109,10 @@ type SecureConnection struct {
109 decryptor cipher.AEAD
110
111 readBuffer *bytebufferpool.ByteBuffer
112 +
113 + // Ensure Close is safe and idempotent
114 + closeOnce sync.Once
115 + closeErr error
116 }
117
118 func (r *SecureConnection) SetDeadline(t time.Time) error {
@@ -242,11 +246,14 @@ func (sc *SecureConnection) Read(p []byte) (int, error) {
246
247 // Close closes the underlying connection and releases resources
248 func (sc *SecureConnection) Close() error {
245 - if sc.readBuffer != nil {
246 - releaseBuffer(sc.readBuffer)
247 - sc.readBuffer = nil
248 - }
249 - return sc.conn.Close()
249 + sc.closeOnce.Do(func() {
250 + if sc.readBuffer != nil {
251 + releaseBuffer(sc.readBuffer)
252 + sc.readBuffer = nil
253 + }
254 + sc.closeErr = sc.conn.Close()
255 + })
256 + return sc.closeErr
257 }
258
259 // ClientHandshake performs the client-side of the handshake