]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
flow/manager: fix coverity divide_by_zero warning
authorJuliana Fajardini <jufajardini@oisf.net>
Fri, 24 Mar 2023 20:04:57 +0000 (17:04 -0300)
committerVictor Julien <vjulien@oisf.net>
Mon, 27 Mar 2023 19:36:26 +0000 (21:36 +0200)
Updated all cases where flow_config.prealloc was used in a division.

*** CID 1524506:  Integer handling issues  (DIVIDE_BY_ZERO)
/src/flow-manager.c: 858 in FlowManager()
852                                "flow_spare_q status: %" PRIu32 "%% flows at the queue",
853                             spare_pool_len, flow_config.prealloc,
854                             spare_pool_len * 100 / flow_config.prealloc);
855
856                     /* only if we have pruned this "emergency_recovery" percentage
857                      * of flows, we will unset the emergency bit */
>>>     CID 1524506:  Integer handling issues  (DIVIDE_BY_ZERO)
>>>     In expression "spare_pool_len * 100U / flow_config.prealloc", division by expression "flow_config.prealloc" which may be zero has undefined behavior.
858                     if (spare_pool_len * 100 / flow_config.prealloc > flow_config.emergency_recovery) {
859                         emerg_over_cnt++;
860                     } else {
861                         emerg_over_cnt = 0;
862                     }

Related to
Bug #5919

src/flow-manager.c

index 1150031ffe40ecb7699eb53eb7b8376e01b4be6c..0756becbc9ee2143369421866e85dfdb85c738c8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2022 Open Information Security Foundation
+/* Copyright (C) 2007-2023 Open Information Security Foundation
  *
  * You can copy, redistribute or modify this Program under the terms of
  * the GNU General Public License version 2 as published by the Free
@@ -851,11 +851,12 @@ static TmEcode FlowManager(ThreadVars *th_v, void *thread_data)
                 SCLogDebug("flow_sparse_q.len = %" PRIu32 " prealloc: %" PRIu32
                            "flow_spare_q status: %" PRIu32 "%% flows at the queue",
                         spare_pool_len, flow_config.prealloc,
-                        spare_pool_len * 100 / flow_config.prealloc);
+                        spare_pool_len * 100 / MAX(flow_config.prealloc, 1));
 
                 /* only if we have pruned this "emergency_recovery" percentage
                  * of flows, we will unset the emergency bit */
-                if (spare_pool_len * 100 / flow_config.prealloc > flow_config.emergency_recovery) {
+                if ((spare_pool_len * 100 / MAX(flow_config.prealloc, 1)) >
+                        flow_config.emergency_recovery) {
                     emerg_over_cnt++;
                 } else {
                     emerg_over_cnt = 0;
@@ -873,7 +874,7 @@ static TmEcode FlowManager(ThreadVars *th_v, void *thread_data)
                                 "ts.tv_usec:%" PRIuMAX ") flow_spare_q status(): %" PRIu32
                                 "%% flows at the queue",
                             (uintmax_t)SCTIME_SECS(ts), (uintmax_t)SCTIME_USECS(ts),
-                            spare_pool_len * 100 / flow_config.prealloc);
+                            spare_pool_len * 100 / MAX(flow_config.prealloc, 1));
 
                     StatsIncr(th_v, ftd->cnt.flow_emerg_mode_over);
                 }