]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
streaming: grow more conservatively
authorVictor Julien <vjulien@oisf.net>
Wed, 1 Feb 2023 16:11:39 +0000 (17:11 +0100)
committerVictor Julien <vjulien@oisf.net>
Fri, 3 Feb 2023 06:18:24 +0000 (07:18 +0100)
Don't grow to next multiple of cfg->buf_size if size is already
a multiple of buf_size.

src/util-streaming-buffer.c

index aeab259a0a724f8a55b71fabfecfcf1574f1d3dc..6855f7387e5663a802bb1e8a2dbdd03106f11197 100644 (file)
@@ -564,6 +564,18 @@ static void SBBPrune(StreamingBuffer *sb, const StreamingBufferConfig *cfg)
 #endif
 }
 
+static inline uint32_t ToNextMultipleOf(const uint32_t in, const uint32_t m)
+{
+    uint32_t r = in;
+    if (m > 0) {
+        const uint32_t x = in % m;
+        if (x != 0) {
+            r = (in - x) + m;
+        }
+    }
+    return r;
+}
+
 static thread_local bool g2s_warn_once = false;
 
 static inline int WARN_UNUSED GrowRegionToSize(StreamingBuffer *sb,
@@ -581,9 +593,8 @@ static inline int WARN_UNUSED GrowRegionToSize(StreamingBuffer *sb,
     }
 
     /* try to grow in multiples of cfg->buf_size */
-    uint32_t x = cfg->buf_size ? size % cfg->buf_size : 0;
-    uint32_t base = size - x;
-    uint32_t grow = base + cfg->buf_size;
+    const uint32_t grow = ToNextMultipleOf(size, cfg->buf_size);
+    SCLogDebug("grow %u", grow);
 
     void *ptr = REALLOC(cfg, region->buf, region->buf_size, grow);
     if (ptr == NULL) {