From d883a1bfe1428817f460b0d88469e857dc2cae4b Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 10 Aug 2023 08:48:54 +0200 Subject: [PATCH] Fix potential busy loop with short timeouts (#9320) --- charger/daheimladen-mb.go | 2 +- charger/keba-modbus.go | 6 +++--- charger/obo.go | 2 +- charger/webasto-next.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/charger/daheimladen-mb.go b/charger/daheimladen-mb.go index be25a4782..64ecdf4cb 100644 --- a/charger/daheimladen-mb.go +++ b/charger/daheimladen-mb.go @@ -104,7 +104,7 @@ func NewDaheimLadenMB(uri string, id uint8) (api.Charger, error) { return nil, fmt.Errorf("failsafe timeout: %w", err) } if u := binary.BigEndian.Uint16(b); u > 0 { - go wb.heartbeat(time.Duration(u/2) * time.Second) + go wb.heartbeat(time.Duration(u) * time.Second / 2) } return wb, err diff --git a/charger/keba-modbus.go b/charger/keba-modbus.go index 1e4c4bbf2..55daba373 100644 --- a/charger/keba-modbus.go +++ b/charger/keba-modbus.go @@ -117,11 +117,11 @@ func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) { // failsafe b, err = wb.conn.ReadHoldingRegisters(kebaRegFailsafeTimeout, 2) if err != nil { - return nil, err + return nil, fmt.Errorf("failsafe timeout: %w", err) } - if timeout := binary.BigEndian.Uint32(b); timeout > 0 { - go wb.heartbeat(900 * time.Millisecond * time.Duration(timeout)) + if u := binary.BigEndian.Uint32(b); u > 0 { + go wb.heartbeat(time.Duration(u) * time.Second / 2) } return decorateKeba(wb, currentPower, totalEnergy, currents, identify, phases), nil diff --git a/charger/obo.go b/charger/obo.go index f96da84d0..a29fa290d 100644 --- a/charger/obo.go +++ b/charger/obo.go @@ -63,7 +63,7 @@ func NewObo(uri, device, comset string, baudrate int, proto modbus.Protocol, sla return nil, fmt.Errorf("failsafe timeout: %w", err) } if u := binary.BigEndian.Uint16(b); u > 0 { - go wb.heartbeat(time.Duration(u/2) * time.Millisecond) + go wb.heartbeat(time.Duration(u) * time.Millisecond / 2) } // lightshow diff --git a/charger/webasto-next.go b/charger/webasto-next.go index ef1076bd2..6b2c70305 100644 --- a/charger/webasto-next.go +++ b/charger/webasto-next.go @@ -98,7 +98,7 @@ func NewWebastoNext(uri string, id uint8) (api.Charger, error) { return nil, fmt.Errorf("failsafe timeout: %w", err) } if u := binary.BigEndian.Uint16(b); u > 0 { - go wb.heartbeat(time.Duration(u/2) * time.Second) + go wb.heartbeat(time.Duration(u) * time.Second / 2) } return wb, err