Fix: writeMux for OPNsense agent WebSocket - prevents concurrent write deadlock
This commit is contained in:
parent
7f5bb07409
commit
2f90697fd0
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user