From: Juliana Fajardini Date: Fri, 24 Mar 2023 20:04:57 +0000 (-0300) Subject: flow/manager: fix coverity divide_by_zero warning X-Git-Tag: suricata-7.0.0-rc2~492 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=754d2803dd5f5956b7f2ae947f933ef03cf1d15b;p=thirdparty%2Fsuricata.git flow/manager: fix coverity divide_by_zero warning 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 --- diff --git a/src/flow-manager.c b/src/flow-manager.c index 1150031ffe..0756becbc9 100644 --- a/src/flow-manager.c +++ b/src/flow-manager.c @@ -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); }