sbb2->len = data_len;
sb->head = sbb;
+ sb->sbb_size = sbb->len + sbb2->len;
SBB_RB_INSERT(&sb->sbb_tree, sbb);
SBB_RB_INSERT(&sb->sbb_tree, sbb2);
sbb->len = data_len;
sb->head = sbb;
+ sb->sbb_size = sbb->len;
SBB_RB_INSERT(&sb->sbb_tree, sbb);
SCLogDebug("sbb %"PRIu64", len %u",
tr: [ ]
*/
if (sa->offset >= tr->offset && sa_re <= tr_re) {
- sa->len = tr->len;
- sa->offset = tr->offset;
- sa_re = sa->offset + sa->len;
- SCLogDebug("-> (fwd) tr %p %"PRIu64"/%u REMOVED ECLIPSED2", tr, tr->offset, tr->len);
- SBB_RB_REMOVE(tree, tr);
- FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
- /*
- sa: [ ]
- tr: [ ]
- sa: [ ]
- tr: [ ]
- sa: [ ]
- tr: [ ]
- */
+ sb->sbb_size -= sa->len;
+ sa->len = tr->len;
+ sa->offset = tr->offset;
+ sa_re = sa->offset + sa->len;
+ SCLogDebug("-> (fwd) tr %p %" PRIu64 "/%u REMOVED ECLIPSED2", tr,
+ tr->offset, tr->len);
+ SBB_RB_REMOVE(tree, tr);
+ FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
+ /*
+ sa: [ ]
+ tr: [ ]
+ sa: [ ]
+ tr: [ ]
+ sa: [ ]
+ tr: [ ]
+ */
} else if (sa->offset <= tr->offset && sa_re >= tr_re) {
SCLogDebug("-> (fwd) tr %p %"PRIu64"/%u REMOVED ECLIPSED", tr, tr->offset, tr->len);
SBB_RB_REMOVE(tree, tr);
+ sb->sbb_size -= tr->len;
FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
/*
sa: [ ]
} else if (sa->offset < tr->offset && // starts before
sa_re >= tr->offset && sa_re < tr_re) // ends inside
{
- // merge
- sa->len = tr_re - sa->offset;
- sa_re = sa->offset + sa->len;
- SCLogDebug("-> (fwd) tr %p %"PRIu64"/%u REMOVED MERGED", tr, tr->offset, tr->len);
- SBB_RB_REMOVE(tree, tr);
- FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
+ // merge. sb->sbb_size includes both so we need to adjust that too.
+ uint32_t combined_len = sa->len + tr->len;
+ sa->len = tr_re - sa->offset;
+ sa_re = sa->offset + sa->len;
+ SCLogDebug("-> (fwd) tr %p %" PRIu64 "/%u REMOVED MERGED", tr,
+ tr->offset, tr->len);
+ SBB_RB_REMOVE(tree, tr);
+ sb->sbb_size -=
+ (combined_len - sa->len); // remove what we added twice
+ FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
}
}
}
break; // entirely after
if (sa->offset >= tr->offset && sa_re <= tr_re) {
- sa->len = tr->len;
- sa->offset = tr->offset;
- sa_re = sa->offset + sa->len;
- SCLogDebug("-> (bwd) tr %p %"PRIu64"/%u REMOVED ECLIPSED2", tr, tr->offset, tr->len);
- if (sb->head == tr)
- sb->head = sa;
- SBB_RB_REMOVE(tree, tr);
- FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
- /*
- sa: [ ]
- tr: [ ]
- sa: [ ]
- tr: [ ]
- sa: [ ]
- tr: [ ]
- */
+ sb->sbb_size -=
+ sa->len; // sa entirely eclipsed so remove double accounting
+ sa->len = tr->len;
+ sa->offset = tr->offset;
+ sa_re = sa->offset + sa->len;
+ SCLogDebug("-> (bwd) tr %p %" PRIu64 "/%u REMOVED ECLIPSED2", tr,
+ tr->offset, tr->len);
+ if (sb->head == tr)
+ sb->head = sa;
+ SBB_RB_REMOVE(tree, tr);
+ FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
+ /*
+ sa: [ ]
+ tr: [ ]
+ sa: [ ]
+ tr: [ ]
+ sa: [ ]
+ tr: [ ]
+ */
} else if (sa->offset <= tr->offset && sa_re >= tr_re) {
SCLogDebug("-> (bwd) tr %p %"PRIu64"/%u REMOVED ECLIPSED", tr, tr->offset, tr->len);
if (sb->head == tr)
sb->head = sa;
SBB_RB_REMOVE(tree, tr);
+ sb->sbb_size -=
+ tr->len; // tr entirely eclipsed so remove double accounting
FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
/*
sa: [ ]
tr: [ ]
*/
} else if (sa->offset > tr->offset && sa_re > tr_re && sa->offset <= tr_re) {
- // merge
- sa->len = sa_re - tr->offset;
- sa->offset = tr->offset;
- sa_re = sa->offset + sa->len;
- SCLogDebug("-> (bwd) tr %p %"PRIu64"/%u REMOVED MERGED", tr, tr->offset, tr->len);
- if (sb->head == tr)
- sb->head = sa;
- SBB_RB_REMOVE(tree, tr);
- FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
+ // merge. sb->sbb_size includes both so we need to adjust that too.
+ uint32_t combined_len = sa->len + tr->len;
+ sa->len = sa_re - tr->offset;
+ sa->offset = tr->offset;
+ sa_re = sa->offset + sa->len;
+ SCLogDebug("-> (bwd) tr %p %" PRIu64 "/%u REMOVED MERGED", tr,
+ tr->offset, tr->len);
+ if (sb->head == tr)
+ sb->head = sa;
+ SBB_RB_REMOVE(tree, tr);
+ sb->sbb_size -=
+ (combined_len - sa->len); // remove what we added twice
+ FREE(sb->cfg, tr, sizeof(StreamingBufferBlock));
}
}
}
FREE(sb->cfg, sbb, sizeof(StreamingBufferBlock));
return 0;
}
+ sb->sbb_size += len; // may adjust based on consolidation below
if (SBB_RB_PREV(sbb) == NULL) {
sb->head = sbb;
} else {
StreamingBufferBlock *sbb = NULL, *safe = NULL;
RB_FOREACH_SAFE(sbb, SBB, &sb->sbb_tree, safe) {
SBB_RB_REMOVE(&sb->sbb_tree, sbb);
+ sb->sbb_size -= sbb->len;
FREE(sb->cfg, sbb, sizeof(StreamingBufferBlock));
}
sb->head = NULL;
if (sbb->len >= shrink_by) {
sbb->len -= shrink_by;
sbb->offset += shrink_by;
+ sb->sbb_size -= shrink_by;
DEBUG_VALIDATE_BUG_ON(sbb->offset != sb->stream_offset);
}
sb->head = sbb;
SBB_RB_REMOVE(&sb->sbb_tree, sbb);
/* either we set it again for the next sbb, or there isn't any */
sb->head = NULL;
+ sb->sbb_size -= sbb->len;
SCLogDebug("sb %p removed %p %"PRIu64", %u", sb, sbb, sbb->offset, sbb->len);
FREE(sb->cfg, sbb, sizeof(StreamingBufferBlock));
}
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg1,(const uint8_t *)"ABCDEFGH", 8));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg2,(const uint8_t *)"01234567", 8));
Dump(sb);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment *seg3 = StreamingBufferAppendRaw(sb, (const uint8_t *)"QWERTY", 6);
FAIL_IF(StreamingBufferSegmentIsBeforeWindow(sb,seg3));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg3,(const uint8_t *)"QWERTY", 6));
Dump(sb);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment *seg4 = StreamingBufferAppendRaw(sb, (const uint8_t *)"KLM", 3);
FAIL_IF(StreamingBufferSegmentIsBeforeWindow(sb,seg4));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg4,(const uint8_t *)"KLM", 3));
Dump(sb);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment *seg5 = StreamingBufferAppendRaw(sb, (const uint8_t *)"!@#$%^&*()_+<>?/,.;:'[]{}-=", 27);
FAIL_IF(StreamingBufferSegmentIsBeforeWindow(sb,seg5));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg5,(const uint8_t *)"!@#$%^&*()_+<>?/,.;:'[]{}-=", 27));
Dump(sb);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment *seg6 = StreamingBufferAppendRaw(sb, (const uint8_t *)"UVWXYZ", 6);
FAIL_IF(StreamingBufferSegmentIsBeforeWindow(sb,seg6));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,seg6,(const uint8_t *)"UVWXYZ", 6));
Dump(sb);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
SCFree(seg1);
Dump(sb);
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSlide(sb, 6);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSlide(sb, 6);
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
+ FAIL_IF_NOT_NULL(sb->head);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
Dump(sb);
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 16);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 22);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSlide(sb, 10);
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 12);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
DumpSegment(sb, &seg1);
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 22);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
/* far ahead of curve: */
DumpSegment(sb, &seg2);
DumpSegment(sb, &seg3);
DumpSegment(sb, &seg4);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 25);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
FAIL_IF(!StreamingBufferSegmentCompareRawData(sb,&seg1,(const uint8_t *)"ABCDEFGH", 8));
StreamingBufferSegment seg2;
FAIL_IF(StreamingBufferInsertAt(sb, &seg2, (const uint8_t *)"C", 1, 2) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 2);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
FAIL_IF(StreamingBufferInsertAt(sb, &seg3, (const uint8_t *)"F", 1, 5) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 3);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg4;
FAIL_IF(StreamingBufferInsertAt(sb, &seg4, (const uint8_t *)"H", 1, 7) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 4);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg5;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg6;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
StreamingBufferSegment seg2;
FAIL_IF(StreamingBufferInsertAt(sb, &seg2, (const uint8_t *)"D", 1, 3) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 2);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
FAIL_IF(StreamingBufferInsertAt(sb, &seg3, (const uint8_t *)"F", 1, 5) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 3);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg4;
FAIL_IF(StreamingBufferInsertAt(sb, &seg4, (const uint8_t *)"H", 1, 7) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 4);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg5;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg6;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
StreamingBufferSegment seg2;
FAIL_IF(StreamingBufferInsertAt(sb, &seg2, (const uint8_t *)"D", 1, 3) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 2);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
FAIL_IF(StreamingBufferInsertAt(sb, &seg3, (const uint8_t *)"F", 1, 5) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 3);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg4;
FAIL_IF(StreamingBufferInsertAt(sb, &seg4, (const uint8_t *)"H", 1, 7) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 4);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg5;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg6;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 20);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 20);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
StreamingBufferSegment seg2;
FAIL_IF(StreamingBufferInsertAt(sb, &seg2, (const uint8_t *)"D", 1, 3) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 2);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg3;
FAIL_IF(StreamingBufferInsertAt(sb, &seg3, (const uint8_t *)"H", 1, 7) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 3);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg4;
FAIL_IF(StreamingBufferInsertAt(sb, &seg4, (const uint8_t *)"F", 1, 5) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 4);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg5;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferSegment seg6;
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
StreamingBufferFree(sb);
StreamingBufferSegment seg3;
FAIL_IF(StreamingBufferInsertAt(sb, &seg3, (const uint8_t *)"H", 1, 7) != 0);
Dump(sb);
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 3);
StreamingBufferSegment seg4;
FAIL_IF(StreamingBufferInsertAt(sb, &seg4, (const uint8_t *)"B", 1, 1) != 0);
FAIL_IF(StreamingBufferInsertAt(sb, &seg6, (const uint8_t *)"G", 1, 6) != 0);
Dump(sb);
FAIL_IF_NOT(sb->head == RB_MIN(SBB, &sb->sbb_tree));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 6);
StreamingBufferSegment seg7;
FAIL_IF(StreamingBufferInsertAt(sb, &seg7, (const uint8_t *)"ABCDEFGHIJ", 10, 0) != 0);
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
StreamingBufferSegment seg8;
FAIL_IF(StreamingBufferInsertAt(sb, &seg8, (const uint8_t *)"abcdefghij", 10, 0) != 0);
FAIL_IF(sbb1->offset != 0);
FAIL_IF(sbb1->len != 10);
FAIL_IF(SBB_RB_NEXT(sbb1));
+ FAIL_IF_NULL(sb->head);
+ FAIL_IF_NOT(sb->sbb_size == 10);
StreamingBufferFree(sb);
PASS;