]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
flow-manager: fix off-by-one in flow_hash row allocation 7206/head
authorArne Welzel <arne.welzel@corelight.com>
Sat, 12 Feb 2022 16:49:07 +0000 (17:49 +0100)
committerShivani Bhardwaj <shivanib134@gmail.com>
Tue, 5 Apr 2022 07:42:05 +0000 (13:12 +0530)
The current code doesn't cover all rows when more than one flow manager is
used. It leaves a single row between ftd->max and ftd->min of the next
manager orphaned. As an example:

    hash_size=1000
    flowmgr_number=3
    range=333

    instance  ftd->min  ftd->max
    0         0         333
    1         334       666
    2         667       1000

    Rows not covered: 333, 666

(cherry picked from commit 8ef066318d7c4dd9b6686dbebd621c790828c384)

src/flow-manager.c

index 359a39eceef9c0b11fb1f3384c4466c9df45ecb8..2a6bc635548a12e434026ddf9fdec52713adc061 100644 (file)
@@ -658,14 +658,13 @@ static TmEcode FlowManagerThreadInit(ThreadVars *t, const void *initdata, void *
     /* set the min and max value used for hash row walking
      * each thread has it's own section of the flow hash */
     uint32_t range = flow_config.hash_size / flowmgr_number;
-    if (ftd->instance == 0)
-        ftd->max = range;
-    else if ((ftd->instance + 1) == flowmgr_number) {
-        ftd->min = (range * ftd->instance) + 1;
+
+    ftd->min = ftd->instance * range;
+    ftd->max = (ftd->instance + 1) * range;
+
+    /* last flow-manager takes on hash_size % flowmgr_number extra rows */
+    if ((ftd->instance + 1) == flowmgr_number) {
         ftd->max = flow_config.hash_size;
-    } else {
-        ftd->min = (range * ftd->instance) + 1;
-        ftd->max = (range * (ftd->instance + 1));
     }
     BUG_ON(ftd->min > flow_config.hash_size || ftd->max > flow_config.hash_size);