From 3ad5d7eea292056002a8d8f68b36d41d3b42e65f Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 12 Nov 2022 02:50:32 +1100 Subject: [PATCH 1/4] fix issue where broadcasts can go to unmapped sessions --- server/channelserver/handlers_stage.go | 2 -- server/channelserver/sys_stage.go | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/channelserver/handlers_stage.go b/server/channelserver/handlers_stage.go index 90ecdec99..07ab06394 100644 --- a/server/channelserver/handlers_stage.go +++ b/server/channelserver/handlers_stage.go @@ -135,7 +135,6 @@ func destructEmptyStages(s *Session) { func removeSessionFromStage(s *Session) { // Remove client from old stage. - s.stage.Lock() delete(s.stage.clients, s) // Delete old stage objects owned by the client. @@ -146,7 +145,6 @@ func removeSessionFromStage(s *Session) { delete(s.stage.objects, object.ownerCharID) } } - s.stage.Unlock() destructEmptyStages(s) destructEmptySemaphores(s) } diff --git a/server/channelserver/sys_stage.go b/server/channelserver/sys_stage.go index 4cd96a7f8..2c5cb5d23 100644 --- a/server/channelserver/sys_stage.go +++ b/server/channelserver/sys_stage.go @@ -69,6 +69,8 @@ func NewStage(ID string) *Stage { // BroadcastMHF queues a MHFPacket to be sent to all sessions in the stage. func (s *Stage) BroadcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session) { + s.Lock() + defer s.Unlock() // Broadcast the data. for session := range s.clients { if session == ignoredSession { From 6897a03781ace00042e42769ef0bce8250c41247 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 12 Nov 2022 02:50:32 +1100 Subject: [PATCH 2/4] fix issue where broadcasts can go to unmapped sessions --- server/channelserver/handlers_stage.go | 2 -- server/channelserver/sys_stage.go | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/channelserver/handlers_stage.go b/server/channelserver/handlers_stage.go index bb5f41ff7..e411365d3 100644 --- a/server/channelserver/handlers_stage.go +++ b/server/channelserver/handlers_stage.go @@ -135,7 +135,6 @@ func destructEmptyStages(s *Session) { func removeSessionFromStage(s *Session) { // Remove client from old stage. - s.stage.Lock() delete(s.stage.clients, s) // Delete old stage objects owned by the client. @@ -146,7 +145,6 @@ func removeSessionFromStage(s *Session) { delete(s.stage.objects, object.ownerCharID) } } - s.stage.Unlock() destructEmptyStages(s) destructEmptySemaphores(s) } diff --git a/server/channelserver/sys_stage.go b/server/channelserver/sys_stage.go index 4cd96a7f8..2c5cb5d23 100644 --- a/server/channelserver/sys_stage.go +++ b/server/channelserver/sys_stage.go @@ -69,6 +69,8 @@ func NewStage(ID string) *Stage { // BroadcastMHF queues a MHFPacket to be sent to all sessions in the stage. func (s *Stage) BroadcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session) { + s.Lock() + defer s.Unlock() // Broadcast the data. for session := range s.clients { if session == ignoredSession { From 67122eb908bb998154ea83b42ee4489e46029f57 Mon Sep 17 00:00:00 2001 From: wish Date: Sun, 12 Feb 2023 15:56:04 +1100 Subject: [PATCH 3/4] rewrite broadcast functions --- server/channelserver/sys_channel_server.go | 13 +++---------- server/channelserver/sys_stage.go | 2 ++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index e388149eb..b61fa5027 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -269,6 +269,8 @@ func (s *Server) manageSessions() { // BroadcastMHF queues a MHFPacket to be sent to all sessions. func (s *Server) BroadcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session) { // Broadcast the data. + s.Lock() + defer s.Unlock() for _, session := range s.sessions { if session == ignoredSession { continue @@ -291,16 +293,7 @@ func (s *Server) WorldcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session, if c == ignoredChannel { continue } - for _, session := range c.sessions { - if session == ignoredSession { - continue - } - bf := byteframe.NewByteFrame() - bf.WriteUint16(uint16(pkt.Opcode())) - pkt.Build(bf, session.clientContext) - bf.WriteUint16(0x0010) - session.QueueSendNonBlocking(bf.Data()) - } + c.BroadcastMHF(pkt, ignoredSession) } } diff --git a/server/channelserver/sys_stage.go b/server/channelserver/sys_stage.go index 2c5cb5d23..435da4373 100644 --- a/server/channelserver/sys_stage.go +++ b/server/channelserver/sys_stage.go @@ -72,6 +72,8 @@ func (s *Stage) BroadcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session) { s.Lock() defer s.Unlock() // Broadcast the data. + s.Lock() + defer s.Unlock() for session := range s.clients { if session == ignoredSession { continue From 445b300b8b26f1df9a45b70d010f6af78b05e0fb Mon Sep 17 00:00:00 2001 From: wish Date: Sun, 5 Mar 2023 22:30:28 +1100 Subject: [PATCH 4/4] remove duplicate stage lock --- server/channelserver/sys_stage.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/server/channelserver/sys_stage.go b/server/channelserver/sys_stage.go index 435da4373..532ae60d4 100644 --- a/server/channelserver/sys_stage.go +++ b/server/channelserver/sys_stage.go @@ -69,9 +69,6 @@ func NewStage(ID string) *Stage { // BroadcastMHF queues a MHFPacket to be sent to all sessions in the stage. func (s *Stage) BroadcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session) { - s.Lock() - defer s.Unlock() - // Broadcast the data. s.Lock() defer s.Unlock() for session := range s.clients {