mesh: Fix FPE in overcommit logic.
authorMichał Lowas-Rzechonek <michal.lowas-rzechonek@silvair.com>
Tue, 31 Mar 2020 09:04:00 +0000 (11:04 +0200)
committerAbhay Agarwal <ay.agarwal@samsung.com>
Fri, 18 Dec 2020 05:40:30 +0000 (11:10 +0530)
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.

Change-Id: I13bd46cd94e4a415ebcf2a97cff283bab2d635f4
Signed-off-by: anuj.bhumiya <anuj.bhumiya@samsung.com>
mesh/mesh-config-json.c

index 23259af..4cb8cae 100644 (file)
@@ -2013,6 +2013,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;