Bug: Race Condition – sessions-Map ohne Mutex aus mehreren Goroutinen zugreifbar #13

Open
opened 2026-06-10 11:45:49 +00:00 by Jannis · 0 comments
Owner

Bug Report – Race Condition (Data Race)

Beschreibung

Die globale sessions-Map wird ohne jegliche Synchronisation aus mehreren Goroutinen gleichzeitig gelesen und geschrieben:

  • voiceUpdate-Handler wird von discordgo in einer eigenen Goroutine aufgerufen
  • Der Cron-Job (*/5 * * * *) läuft ebenfalls in einer eigenen Goroutine
  • Beim Shutdown iteriert main() über die Map

Das ist ein klassischer Data Race in Go. Wenn mehrere Voice-Events gleichzeitig eintreffen und der Cron gleichzeitig läuft, kann es zu Panic (concurrent map read and write) oder korrupten Daten kommen.

Betroffene Stellen

  • main.go: for uid, sess := range sessions (Cron + Shutdown)
  • main.go: sessions[uid] = ..., delete(sessions, uid) in voiceUpdate()
  • main.go: processAndSave() – liest und mutiert sess-Felder

Fix

Einen sync.RWMutex (oder sync.Mutex) einfügen:

var (
    sessions   = make(map[string]*Session)
    sessionsMu sync.Mutex
)

Vor jedem Zugriff auf sessions sperren:

sessionsMu.Lock()
defer sessionsMu.Unlock()

Schweregrad

Hoch – kann zu Panic und Datenverlust führen, besonders wenn viele User gleichzeitig den Voice-Channel wechseln.

## Bug Report – Race Condition (Data Race) ### Beschreibung Die globale `sessions`-Map wird **ohne jegliche Synchronisation** aus mehreren Goroutinen gleichzeitig gelesen und geschrieben: - `voiceUpdate`-Handler wird von discordgo in einer eigenen Goroutine aufgerufen - Der Cron-Job (`*/5 * * * *`) läuft ebenfalls in einer eigenen Goroutine - Beim Shutdown iteriert `main()` über die Map Das ist ein klassischer **Data Race** in Go. Wenn mehrere Voice-Events gleichzeitig eintreffen und der Cron gleichzeitig läuft, kann es zu Panic (concurrent map read and write) oder korrupten Daten kommen. ### Betroffene Stellen - `main.go`: `for uid, sess := range sessions` (Cron + Shutdown) - `main.go`: `sessions[uid] = ...`, `delete(sessions, uid)` in `voiceUpdate()` - `main.go`: `processAndSave()` – liest und mutiert `sess`-Felder ### Fix Einen `sync.RWMutex` (oder `sync.Mutex`) einfügen: ```go var ( sessions = make(map[string]*Session) sessionsMu sync.Mutex ) ``` Vor jedem Zugriff auf `sessions` sperren: ```go sessionsMu.Lock() defer sessionsMu.Unlock() ``` ### Schweregrad Hoch – kann zu Panic und Datenverlust führen, besonders wenn viele User gleichzeitig den Voice-Channel wechseln.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starfour/discord-go-bot#13