]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
MemBuffer: add expansion call
authorVictor Julien <victor@inliniac.net>
Wed, 3 Dec 2014 12:09:15 +0000 (13:09 +0100)
committerVictor Julien <victor@inliniac.net>
Wed, 3 Dec 2014 12:09:15 +0000 (13:09 +0100)
For some of the buffer users it's hard to predict how big the data
will be. In the stats.log case this depends on chosen runmode and
number of threads.

To deal with this case a 'MemBufferExpand' call is added. This realloc's
the buffer.

src/util-buffer.c
src/util-buffer.h

index 8dd108e8ef3779dabdc65fe3b10e638abe5ee9a3..d4f50b06a41b293a8510e6aa6de4b530ed79c33c 100644 (file)
@@ -51,6 +51,34 @@ MemBuffer *MemBufferCreateNew(uint32_t size)
     return buffer;
 }
 
+/** \brief expand membuffer by size of 'expand_by'
+ *
+ *  If expansion failed, buffer will still be valid.
+ *
+ *  \retval result 0 ok, -1 expansion failed
+ */
+int MemBufferExpand(MemBuffer **buffer, uint32_t expand_by) {
+    if (((*buffer)->size + expand_by) > MAX_LIMIT) {
+        SCLogWarning(SC_ERR_MEM_BUFFER_API, "Mem buffer asked to create "
+                     "buffer with size greater than API limit - %d", MAX_LIMIT);
+        return -1;
+    }
+
+    uint32_t total_size = (*buffer)->size + sizeof(MemBuffer) + expand_by;
+
+    MemBuffer *tbuffer = SCRealloc(*buffer, total_size);
+    if (unlikely(tbuffer == NULL)) {
+        return -1;
+    }
+
+    *buffer = tbuffer;
+    (*buffer)->size += expand_by;
+    (*buffer)->buffer = (uint8_t *)tbuffer + sizeof(MemBuffer);
+
+    SCLogDebug("expanded buffer by %u, size is now %u", expand_by, (*buffer)->size);
+    return 0;
+}
+
 void MemBufferFree(MemBuffer *buffer)
 {
     SCFree(buffer);
index 5c592ae43a32644ec94a73c291a1ef1abf6eb391..602b4df068640f4f2ce17f76a54edf3b6c8756c9 100644 (file)
@@ -31,6 +31,7 @@ typedef struct MemBuffer_ {
 } MemBuffer;
 
 MemBuffer *MemBufferCreateNew(uint32_t size);
+int MemBufferExpand(MemBuffer **buffer, uint32_t expand_by);
 void MemBufferFree(MemBuffer *buffer);
 
 /**
@@ -53,6 +54,11 @@ void MemBufferFree(MemBuffer *buffer);
  */
 #define MEMBUFFER_OFFSET(mem_buffer) (mem_buffer)->offset
 
+/**
+ * \brief Get the MemBuffers current size.
+ */
+#define MEMBUFFER_SIZE(mem_buffer) (mem_buffer)->size
+
 /**
  * \brief Write a buffer to the file pointer.
  *