*
* [block][gap][block]
**/
-static void SBBInit(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
+static int WARN_UNUSED SBBInit(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
StreamingBufferRegion *region, uint32_t rel_offset, uint32_t data_len)
{
DEBUG_VALIDATE_BUG_ON(!RB_EMPTY(&sb->sbb_tree));
/* need to set up 2: existing data block and new data block */
StreamingBufferBlock *sbb = CALLOC(cfg, 1, sizeof(*sbb));
if (sbb == NULL) {
- return;
+ return -1;
}
sbb->offset = sb->region.stream_offset;
sbb->len = sb->region.buf_offset;
StreamingBufferBlock *sbb2 = CALLOC(cfg, 1, sizeof(*sbb2));
if (sbb2 == NULL) {
FREE(cfg, sbb, sizeof(*sbb));
- return;
+ return -1;
}
sbb2->offset = region->stream_offset + rel_offset;
sbb2->len = data_len;
SBBPrintList(sb);
#endif
BUG_ON(sbb2->offset < sbb->len);
+ return 0;
}
/* setup with leading gap
*
* [gap][block]
**/
-static void SBBInitLeadingGap(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
+static int WARN_UNUSED SBBInitLeadingGap(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
StreamingBufferRegion *region, uint64_t offset, uint32_t data_len)
{
DEBUG_VALIDATE_BUG_ON(!RB_EMPTY(&sb->sbb_tree));
StreamingBufferBlock *sbb = CALLOC(cfg, 1, sizeof(*sbb));
if (sbb == NULL)
- return;
+ return -1;
sbb->offset = offset;
sbb->len = data_len;
#ifdef DEBUG
SBBPrintList(sb);
#endif
+ return 0;
}
static inline void ConsolidateFwd(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
sb->region.buf_offset += data_len;
if (!RB_EMPTY(&sb->sbb_tree)) {
- SBBUpdate(sb, cfg, &sb->region, rel_offset, data_len);
+ return SBBUpdate(sb, cfg, &sb->region, rel_offset, data_len);
+ } else {
+ return 0;
}
- return 0;
}
/**
sb->region.buf_offset += data_len;
if (!RB_EMPTY(&sb->sbb_tree)) {
- SBBUpdate(sb, cfg, &sb->region, rel_offset, data_len);
+ return SBBUpdate(sb, cfg, &sb->region, rel_offset, data_len);
+ } else {
+ return 0;
}
- return 0;
}
#define DATA_FITS_AT_OFFSET(region, len, offset) ((offset) + (len) <= (region)->buf_size)
} else if (sb->region.buf_offset) {
SCLogDebug("beyond expected offset: SBBInit");
/* existing data, but there is a gap between us */
- SBBInit(sb, cfg, region, rel_offset, data_len);
+ if (SBBInit(sb, cfg, region, rel_offset, data_len) < 0)
+ return -1;
} else {
/* gap before data in empty list */
SCLogDebug("empty sbb list: invoking SBBInitLeadingGap");
- SBBInitLeadingGap(sb, cfg, region, offset, data_len);
+ if (SBBInitLeadingGap(sb, cfg, region, offset, data_len) < 0)
+ return -1;
}
}
} else {
if (sb->region.buf_offset) {
/* existing data, but there is a gap between us */
SCLogDebug("empty sbb list, no data in main: use SBBInit");
- SBBInit(sb, cfg, region, rel_offset, data_len);
+ if (SBBInit(sb, cfg, region, rel_offset, data_len) < 0)
+ return -1;
} else {
/* gap before data in empty list */
SCLogDebug("empty sbb list: invoking SBBInitLeadingGap");
- SBBInitLeadingGap(sb, cfg, region, offset, data_len);
+ if (SBBInitLeadingGap(sb, cfg, region, offset, data_len) < 0)
+ return -1;
}
if (rel_offset == region->buf_offset) {
SCLogDebug("pre region->buf_offset %u", region->buf_offset);
} else {
SCLogDebug("updating sbb tree");
/* already have blocks, so append new block based on new data */
- SBBUpdate(sb, cfg, region, rel_offset, data_len);
+ if (SBBUpdate(sb, cfg, region, rel_offset, data_len) < 0)
+ return -1;
}
BUG_ON(!region_is_main && sb->head == NULL);