Fix: writeMux for OPNsense agent WebSocket - prevents concurrent write deadlock

This commit is contained in:
cynfo3000 2026-03-04 09:08:21 +01:00
parent 7f5bb07409
commit 2f90697fd0

View File

@ -21,6 +21,7 @@ type Client struct {
conn *websocket.Conn conn *websocket.Conn
connMux sync.RWMutex connMux sync.RWMutex
writeMux sync.Mutex
reconnectInterval time.Duration reconnectInterval time.Duration
pingInterval time.Duration pingInterval time.Duration
@ -215,15 +216,18 @@ func (c *Client) runConnection() {
return return
case <-pingTicker.C: case <-pingTicker.C:
c.writeMux.Lock()
c.connMux.RLock() c.connMux.RLock()
if c.conn != nil { conn := c.conn
if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil { c.connMux.RUnlock()
c.connMux.RUnlock() if conn != nil {
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
c.writeMux.Unlock()
log.Printf("Ping senden fehlgeschlagen: %v", err) log.Printf("Ping senden fehlgeschlagen: %v", err)
return return
} }
} }
c.connMux.RUnlock() c.writeMux.Unlock()
case msg := <-msgChan: case msg := <-msgChan:
go c.handleMessage(msg) go c.handleMessage(msg)
@ -289,7 +293,10 @@ func (c *Client) SendMessage(msg Message) error {
return fmt.Errorf("keine WebSocket-Verbindung") return fmt.Errorf("keine WebSocket-Verbindung")
} }
return conn.WriteJSON(msg) c.writeMux.Lock()
err := conn.WriteJSON(msg)
c.writeMux.Unlock()
return err
} }
func (c *Client) SendBinaryData(data []byte) error { func (c *Client) SendBinaryData(data []byte) error {
@ -301,7 +308,10 @@ func (c *Client) SendBinaryData(data []byte) error {
return fmt.Errorf("keine WebSocket-Verbindung") return fmt.Errorf("keine WebSocket-Verbindung")
} }
return conn.WriteMessage(websocket.BinaryMessage, data) c.writeMux.Lock()
err := conn.WriteMessage(websocket.BinaryMessage, data)
c.writeMux.Unlock()
return err
} }
func (c *Client) IsConnected() bool { func (c *Client) IsConnected() bool {