]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
streaming/sbb: propegate allocation errors
authorVictor Julien <vjulien@oisf.net>
Fri, 3 Feb 2023 06:47:20 +0000 (07:47 +0100)
committerVictor Julien <vjulien@oisf.net>
Tue, 25 Apr 2023 09:36:37 +0000 (11:36 +0200)
(cherry picked from commit d6b4c9022534072d3eaac275f11642dadf841da0)

src/util-streaming-buffer.c

index 3a9c423528ac72684c54bbe819083d02a72e7f4f..bd5b5dd73f102b6dd20b0eaf03b0538e93c3693c 100644 (file)
@@ -171,8 +171,7 @@ static void SBBPrintList(StreamingBuffer *sb)
  *
  * [block][gap][block]
  **/
-static void SBBInit(StreamingBuffer *sb,
-                    uint32_t rel_offset, uint32_t data_len)
+static int WARN_UNUSED SBBInit(StreamingBuffer *sb, uint32_t rel_offset, uint32_t data_len)
 {
     DEBUG_VALIDATE_BUG_ON(!RB_EMPTY(&sb->sbb_tree));
     DEBUG_VALIDATE_BUG_ON(sb->buf_offset > sb->stream_offset + rel_offset);
@@ -180,7 +179,7 @@ static void SBBInit(StreamingBuffer *sb,
     /* need to set up 2: existing data block and new data block */
     StreamingBufferBlock *sbb = CALLOC(sb->cfg, 1, sizeof(*sbb));
     if (sbb == NULL) {
-        return;
+        return -1;
     }
     sbb->offset = sb->stream_offset;
     sbb->len = sb->buf_offset;
@@ -188,7 +187,7 @@ static void SBBInit(StreamingBuffer *sb,
     StreamingBufferBlock *sbb2 = CALLOC(sb->cfg, 1, sizeof(*sbb2));
     if (sbb2 == NULL) {
         FREE(sb->cfg, sbb, sizeof(*sbb));
-        return;
+        return -1;
     }
     sbb2->offset = sb->stream_offset + rel_offset;
     sbb2->len = data_len;
@@ -204,20 +203,20 @@ static void SBBInit(StreamingBuffer *sb,
     SBBPrintList(sb);
 #endif
     BUG_ON(sbb2->offset < sbb->len);
+    return 0;
 }
 
 /* setup with leading gap
  *
  * [gap][block]
  **/
-static void SBBInitLeadingGap(StreamingBuffer *sb,
-                              uint64_t offset, uint32_t data_len)
+static int WARN_UNUSED SBBInitLeadingGap(StreamingBuffer *sb, uint64_t offset, uint32_t data_len)
 {
     DEBUG_VALIDATE_BUG_ON(!RB_EMPTY(&sb->sbb_tree));
 
     StreamingBufferBlock *sbb = CALLOC(sb->cfg, 1, sizeof(*sbb));
     if (sbb == NULL)
-        return;
+        return -1;
     sbb->offset = offset;
     sbb->len = data_len;
 
@@ -230,6 +229,7 @@ static void SBBInitLeadingGap(StreamingBuffer *sb,
 #ifdef DEBUG
     SBBPrintList(sb);
 #endif
+    return 0;
 }
 
 static inline void ConsolidateFwd(StreamingBuffer *sb,
@@ -389,10 +389,9 @@ static int Insert(StreamingBuffer *sb, struct SBB *tree,
     return 0;
 }
 
-static void SBBUpdate(StreamingBuffer *sb,
-                      uint32_t rel_offset, uint32_t data_len)
+static int SBBUpdate(StreamingBuffer *sb, uint32_t rel_offset, uint32_t data_len)
 {
-    Insert(sb, &sb->sbb_tree, rel_offset, data_len);
+    return Insert(sb, &sb->sbb_tree, rel_offset, data_len);
 }
 
 static void SBBFree(StreamingBuffer *sb)
@@ -648,9 +647,10 @@ int StreamingBufferAppend(StreamingBuffer *sb, StreamingBufferSegment *seg,
     sb->buf_offset += data_len;
 
     if (!RB_EMPTY(&sb->sbb_tree)) {
-        SBBUpdate(sb, rel_offset, data_len);
+        return SBBUpdate(sb, rel_offset, data_len);
+    } else {
+        return 0;
     }
-    return 0;
 }
 
 /**
@@ -687,9 +687,10 @@ int StreamingBufferAppendNoTrack(StreamingBuffer *sb,
     sb->buf_offset += data_len;
 
     if (!RB_EMPTY(&sb->sbb_tree)) {
-        SBBUpdate(sb, rel_offset, data_len);
+        return SBBUpdate(sb, rel_offset, data_len);
+    } else {
+        return 0;
     }
-    return 0;
 }
 
 #define DATA_FITS_AT_OFFSET(sb, len, offset) \
@@ -754,16 +755,19 @@ int StreamingBufferInsertAt(StreamingBuffer *sb, StreamingBufferSegment *seg,
                 // nothing to do
             } else if (sb->buf_offset) {
                 /* existing data, but there is a gap between us */
-                SBBInit(sb, rel_offset, data_len);
+                if (SBBInit(sb, rel_offset, data_len) < 0)
+                    return -1;
             } else {
                 /* gap before data in empty list */
                 SCLogDebug("empty sbb list: invoking SBBInitLeadingGap");
-                SBBInitLeadingGap(sb, offset, data_len);
+                if (SBBInitLeadingGap(sb, offset, data_len) < 0)
+                    return -1;
             }
         }
     } else {
         /* already have blocks, so append new block based on new data */
-        SBBUpdate(sb, rel_offset, data_len);
+        if (SBBUpdate(sb, rel_offset, data_len) < 0)
+            return -1;
     }
 
     if (rel_offset + data_len > sb->buf_offset)