From: Victor Julien Date: Wed, 3 Dec 2014 12:09:15 +0000 (+0100) Subject: MemBuffer: add expansion call X-Git-Tag: suricata-2.1beta3~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6277d2e0e47fecc72807e09938307b18934a03df;p=thirdparty%2Fsuricata.git MemBuffer: add expansion call 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. --- diff --git a/src/util-buffer.c b/src/util-buffer.c index 8dd108e8ef..d4f50b06a4 100644 --- a/src/util-buffer.c +++ b/src/util-buffer.c @@ -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); diff --git a/src/util-buffer.h b/src/util-buffer.h index 5c592ae43a..602b4df068 100644 --- a/src/util-buffer.h +++ b/src/util-buffer.h @@ -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. *