From 9dfc856b7450a3725034d73cecaf6802ced55471 Mon Sep 17 00:00:00 2001 From: Jianhui Zhao Date: Fri, 25 Apr 2025 16:03:56 +0800 Subject: [PATCH] fix: Fix potential panic issue ``` 2025-04-24T06:59:56Z |INFO| New session: 81ee1ed4d12c3048620fbb2168c08257 2025-04-24T07:00:10Z |INFO| Delete session: 81ee1ed4d12c3048620fbb2168c08257 2025-04-24T07:00:17Z |INFO| New session: 427ce01b7f47a7ee8192cefdfa291c8f 2025-04-24T07:00:57Z |INFO| Delete session: 427ce01b7f47a7ee8192cefdfa291c8f 2025-04-24T07:01:55Z |INFO| New session: ffbfd5c596195c2bd43b8c0b6dc3d135 2025-04-24T07:01:57Z |ERRO| websocket: close sent panic: send on closed channel goroutine 33 [running]: main.(*user).WriteMsg(0xc00037e680, 0x2, {0xc000188d10, 0xc, 0xc}) /home/runner/work/rttys/rttys/user.go:52 +0x8b main.(*broker).run(0xc00035a000) /home/runner/work/rttys/rttys/broker.go:227 +0xf34 created by main.runRttys in goroutine 1 /home/runner/work/rttys/rttys/main.go:86 +0x595 ``` Signed-off-by: Jianhui Zhao --- broker.go | 3 ++- client/client.go | 2 ++ device.go | 6 +++++- user.go | 7 ++++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/broker.go b/broker.go index 1ba7632..4bd6c97 100644 --- a/broker.go +++ b/broker.go @@ -147,7 +147,8 @@ func (br *broker) run() { time.AfterFunc(time.Second*3, func() { if atomic.LoadUint32(&s.confirmed) == 0 { - c.Close() + log.Error().Msgf("Session '%s' confirm timeout", sid) + c.CloseConn() } }) diff --git a/client/client.go b/client/client.go index 4809ce4..abde620 100644 --- a/client/client.go +++ b/client/client.go @@ -12,5 +12,7 @@ type Client interface { Close() + CloseConn() + Closed() bool } diff --git a/device.go b/device.go index edea542..40e1c9a 100644 --- a/device.go +++ b/device.go @@ -135,6 +135,10 @@ func (dev *device) Closed() bool { return atomic.LoadUint32(&dev.closed) == 1 } +func (dev *device) CloseConn() { + dev.conn.Close() +} + func (dev *device) Close() { if dev.Closed() { return @@ -144,7 +148,7 @@ func (dev *device) Close() { log.Debug().Msgf("Device '%s' disconnected", dev.conn.RemoteAddr()) - dev.conn.Close() + dev.CloseConn() close(dev.send) } diff --git a/user.go b/user.go index d7ff913..f1e3501 100644 --- a/user.go +++ b/user.go @@ -59,6 +59,10 @@ func (u *user) Closed() bool { return atomic.LoadUint32(&u.closed) == 1 } +func (u *user) CloseConn() { + u.conn.Close() +} + func (u *user) Close() { if u.Closed() { return @@ -66,7 +70,8 @@ func (u *user) Close() { atomic.StoreUint32(&u.closed, 1) - u.conn.Close() + u.CloseConn() + close(u.send) }