]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
streaming/buffer: set hard limit on buffer size
authorVictor Julien <vjulien@oisf.net>
Thu, 24 Nov 2022 11:01:13 +0000 (12:01 +0100)
committerVictor Julien <vjulien@oisf.net>
Sat, 26 Nov 2022 06:07:15 +0000 (07:07 +0100)
Don't allow the buffer to grow beyond 1GiB. Add a once per thread
warning if it does reach it.

Bug: #5703.
(cherry picked from commit df7d8d96c95a79425d8ce75dc95da32a177a700a)

src/util-streaming-buffer.c

index 3e6375c625e6f9ff81e0cdd10d5d9adccc06c35b..0001c07a4e302c89dabe044f248fbf0cbff6bafb 100644 (file)
@@ -456,9 +456,22 @@ static void AutoSlide(StreamingBuffer *sb)
     SBBPrune(sb);
 }
 
+static thread_local bool g2s_warn_once = false;
+
 static int WARN_UNUSED
 GrowToSize(StreamingBuffer *sb, uint32_t size)
 {
+    DEBUG_VALIDATE_BUG_ON(sb->buf_size > BIT_U32(30));
+    if (size > BIT_U32(30)) { // 1GiB
+        if (!g2s_warn_once) {
+            SCLogWarning(SC_ERR_MEM_ALLOC,
+                    "StreamingBuffer::GrowToSize() tried to alloc %u bytes, exceeds limit of %lu",
+                    size, BIT_U32(30));
+            g2s_warn_once = true;
+        }
+        return -1;
+    }
+
     /* try to grow in multiples of sb->cfg->buf_size */
     uint32_t x = sb->cfg->buf_size ? size % sb->cfg->buf_size : 0;
     uint32_t base = size - x;
@@ -485,6 +498,8 @@ GrowToSize(StreamingBuffer *sb, uint32_t size)
     return 0;
 }
 
+static thread_local bool grow_warn_once = false;
+
 /** \internal
  *  \brief try to double the buffer size
  *  \retval 0 ok
@@ -492,7 +507,18 @@ GrowToSize(StreamingBuffer *sb, uint32_t size)
  */
 static int WARN_UNUSED Grow(StreamingBuffer *sb)
 {
+    DEBUG_VALIDATE_BUG_ON(sb->buf_size > BIT_U32(30));
     uint32_t grow = sb->buf_size * 2;
+    if (grow > BIT_U32(30)) { // 1GiB
+        if (!grow_warn_once) {
+            SCLogWarning(SC_ERR_MEM_ALLOC,
+                    "StreamingBuffer::Grow() tried to alloc %u bytes, exceeds limit of %lu", grow,
+                    BIT_U32(30));
+            grow_warn_once = true;
+        }
+        return -1;
+    }
+
     void *ptr = REALLOC(sb->cfg, sb->buf, sb->buf_size, grow);
     if (ptr == NULL)
         return -1;