From ad8ae5027ab3f223203e0914475ca43fbdf079d2 Mon Sep 17 00:00:00 2001 From: "Alex S." Date: Fri, 19 Jun 2026 14:40:08 +0300 Subject: [PATCH] fix: guard decryptors map with RWMutex to prevent data race --- golibdave/golibdave.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/golibdave/golibdave.go b/golibdave/golibdave.go index 857625d..f69859a 100644 --- a/golibdave/golibdave.go +++ b/golibdave/golibdave.go @@ -2,6 +2,7 @@ package golibdave import ( "log/slog" + "sync" "github.com/disgoorg/godave" "github.com/disgoorg/godave/libdave" @@ -43,6 +44,7 @@ type session struct { callbacks godave.Callbacks session *libdave.Session encryptor *libdave.Encryptor + decryptorsMu sync.RWMutex decryptors map[godave.UserID]*libdave.Decryptor preparedTransitions map[uint16]uint16 lastPreparedTransitionVersion uint16 @@ -69,7 +71,10 @@ func (s *session) Encrypt(ssrc uint32, frame []byte, encryptedFrame []byte) (int } func (s *session) MaxDecryptedFrameSize(userID godave.UserID, frameSize int) int { - if decryptor, ok := s.decryptors[userID]; ok { + s.decryptorsMu.RLock() + decryptor, ok := s.decryptors[userID] + s.decryptorsMu.RUnlock() + if ok { return decryptor.GetMaxPlaintextByteSize(libdave.MediaTypeAudio, frameSize) } @@ -78,7 +83,10 @@ func (s *session) MaxDecryptedFrameSize(userID godave.UserID, frameSize int) int } func (s *session) Decrypt(userID godave.UserID, frame []byte, decryptedFrame []byte) (int, error) { - if decryptor, ok := s.decryptors[userID]; ok { + s.decryptorsMu.RLock() + decryptor, ok := s.decryptors[userID] + s.decryptorsMu.RUnlock() + if ok { return decryptor.Decrypt(libdave.MediaTypeAudio, frame, decryptedFrame) } @@ -87,12 +95,16 @@ func (s *session) Decrypt(userID godave.UserID, frame []byte, decryptedFrame []b } func (s *session) AddUser(userID godave.UserID) { + s.decryptorsMu.Lock() s.decryptors[userID] = libdave.NewDecryptor() + s.decryptorsMu.Unlock() s.setupKeyRatchetForUser(userID, s.lastPreparedTransitionVersion) } func (s *session) RemoveUser(userID godave.UserID) { + s.decryptorsMu.Lock() delete(s.decryptors, userID) + s.decryptorsMu.Unlock() } func (s *session) OnSelectProtocolAck(protocolVersion uint16) {