From d565cc8dda58f86cbe266f6d1fb5803b8fac46db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Lowas-Rzechonek?= Date: Tue, 31 Mar 2020 11:04:00 +0200 Subject: [PATCH] mesh: Fix FPE in overcommit logic. During overcommit, mesh_config_save is called in asynchronous mode to avoid blocking Send() calls. This means that update of cfg->write_time is scheduled via l_idle_oneshot, so if the next Send() gets scheduled first, the code may see elapsed time of zero. If this happens, then the overcommit logic was already executed and the overcommit is pending, so we can just return. --- mesh/mesh-config-json.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c index d3f423e50..05b2a5651 100644 --- a/mesh/mesh-config-json.c +++ b/mesh/mesh-config-json.c @@ -2012,6 +2012,14 @@ bool mesh_config_write_seq_number(struct mesh_config *cfg, uint32_t seq, timersub(&now, &cfg->write_time, &elapsed); elapsed_ms = elapsed.tv_sec * 1000 + elapsed.tv_usec / 1000; + /* + * If time since last write is zero, this means that + * idle_save_config is already pending, so we don't need to do + * anything. + */ + if (!elapsed_ms) + return true; + cached = seq + (seq - cfg->write_seq) * 1000 * MIN_SEQ_CACHE_TIME / elapsed_ms; -- 2.47.3