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
connMux sync.RWMutex
writeMux sync.Mutex
reconnectInterval time.Duration
pingInterval time.Duration
@ -215,15 +216,18 @@ func (c *Client) runConnection() {
return
case <-pingTicker.C:
c.writeMux.Lock()
c.connMux.RLock()
if c.conn != nil {
if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {
c.connMux.RUnlock()
conn := c.conn
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)
return
}
}
c.connMux.RUnlock()
c.writeMux.Unlock()
case msg := <-msgChan:
go c.handleMessage(msg)
@ -289,7 +293,10 @@ func (c *Client) SendMessage(msg Message) error {
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 {
@ -301,7 +308,10 @@ func (c *Client) SendBinaryData(data []byte) error {
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 {