summaryrefslogtreecommitdiffstats
path: root/src/util-streaming-buffer.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-24 01:56:37 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-24 01:56:37 +0000
commit8f4cc1aaed27bf561cad096d47c24903421c7ab7 (patch)
tree9f8ecf92240a8ef68527ec4b4349e0950d23dc3a /src/util-streaming-buffer.c
parentReleasing progress-linux version 1:7.0.4-1~progress7.99u1. (diff)
downloadsuricata-8f4cc1aaed27bf561cad096d47c24903421c7ab7.tar.xz
suricata-8f4cc1aaed27bf561cad096d47c24903421c7ab7.zip
Merging upstream version 1:7.0.5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/util-streaming-buffer.c')
-rw-r--r--src/util-streaming-buffer.c63
1 files changed, 53 insertions, 10 deletions
diff --git a/src/util-streaming-buffer.c b/src/util-streaming-buffer.c
index 6ff4f43..204ef2e 100644
--- a/src/util-streaming-buffer.c
+++ b/src/util-streaming-buffer.c
@@ -1064,7 +1064,15 @@ void StreamingBufferSlideToOffset(
DEBUG_VALIDATE_BUG_ON(sb->region.stream_offset < offset);
}
-#define DATA_FITS(sb, len) ((sb)->region.buf_offset + (len) <= (sb)->region.buf_size)
+static int DataFits(const StreamingBuffer *sb, const uint32_t len)
+{
+ uint64_t buf_offset64 = sb->region.buf_offset;
+ uint64_t len64 = len;
+ if (len64 + buf_offset64 > UINT32_MAX) {
+ return -1;
+ }
+ return sb->region.buf_offset + len <= sb->region.buf_size;
+}
int StreamingBufferAppend(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
StreamingBufferSegment *seg, const uint8_t *data, uint32_t data_len)
@@ -1076,7 +1084,11 @@ int StreamingBufferAppend(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
return -1;
}
- if (!DATA_FITS(sb, data_len)) {
+ int r = DataFits(sb, data_len);
+ if (r < 0) {
+ DEBUG_VALIDATE_BUG_ON(1);
+ return -1;
+ } else if (r == 0) {
if (sb->region.buf_size == 0) {
if (GrowToSize(sb, cfg, data_len) != SC_OK)
return -1;
@@ -1085,7 +1097,7 @@ int StreamingBufferAppend(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
return -1;
}
}
- DEBUG_VALIDATE_BUG_ON(!DATA_FITS(sb, data_len));
+ DEBUG_VALIDATE_BUG_ON(DataFits(sb, data_len) != 1);
memcpy(sb->region.buf + sb->region.buf_offset, data, data_len);
seg->stream_offset = sb->region.stream_offset + sb->region.buf_offset;
@@ -1111,7 +1123,11 @@ int StreamingBufferAppendNoTrack(StreamingBuffer *sb, const StreamingBufferConfi
return -1;
}
- if (!DATA_FITS(sb, data_len)) {
+ int r = DataFits(sb, data_len);
+ if (r < 0) {
+ DEBUG_VALIDATE_BUG_ON(1);
+ return -1;
+ } else if (r == 0) {
if (sb->region.buf_size == 0) {
if (GrowToSize(sb, cfg, data_len) != SC_OK)
return -1;
@@ -1120,7 +1136,7 @@ int StreamingBufferAppendNoTrack(StreamingBuffer *sb, const StreamingBufferConfi
return -1;
}
}
- DEBUG_VALIDATE_BUG_ON(!DATA_FITS(sb, data_len));
+ DEBUG_VALIDATE_BUG_ON(DataFits(sb, data_len) != 1);
memcpy(sb->region.buf + sb->region.buf_offset, data, data_len);
uint32_t rel_offset = sb->region.buf_offset;
@@ -1133,7 +1149,15 @@ int StreamingBufferAppendNoTrack(StreamingBuffer *sb, const StreamingBufferConfi
}
}
-#define DATA_FITS_AT_OFFSET(region, len, offset) ((offset) + (len) <= (region)->buf_size)
+static int DataFitsAtOffset(
+ const StreamingBufferRegion *region, const uint32_t len, const uint32_t offset)
+{
+ const uint64_t offset64 = offset;
+ const uint64_t len64 = len;
+ if (offset64 + len64 > UINT32_MAX)
+ return -1;
+ return (offset + len <= region->buf_size);
+}
#if defined(DEBUG) || defined(DEBUG_VALIDATION)
static void Validate(const StreamingBuffer *sb)
@@ -1477,8 +1501,6 @@ static StreamingBufferRegion *BufferInsertAtRegion(StreamingBuffer *sb,
int StreamingBufferInsertAt(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
StreamingBufferSegment *seg, const uint8_t *data, uint32_t data_len, uint64_t offset)
{
- int r;
-
DEBUG_VALIDATE_BUG_ON(seg == NULL);
DEBUG_VALIDATE_BUG_ON(offset < sb->region.stream_offset);
if (offset < sb->region.stream_offset) {
@@ -1496,11 +1518,15 @@ int StreamingBufferInsertAt(StreamingBuffer *sb, const StreamingBufferConfig *cf
region == &sb->region ? "main" : "aux", region);
uint32_t rel_offset = offset - region->stream_offset;
- if (!DATA_FITS_AT_OFFSET(region, data_len, rel_offset)) {
+ int r = DataFitsAtOffset(region, data_len, rel_offset);
+ if (r < 0) {
+ DEBUG_VALIDATE_BUG_ON(1);
+ return SC_ELIMIT;
+ } else if (r == 0) {
if ((r = GrowToSize(sb, cfg, (rel_offset + data_len))) != SC_OK)
return r;
}
- DEBUG_VALIDATE_BUG_ON(!DATA_FITS_AT_OFFSET(region, data_len, rel_offset));
+ DEBUG_VALIDATE_BUG_ON(DataFitsAtOffset(region, data_len, rel_offset) != 1);
SCLogDebug("offset %" PRIu64 " data_len %u, rel_offset %u into region offset %" PRIu64
", buf_offset %u, buf_size %u",
@@ -2320,6 +2346,22 @@ static int StreamingBufferTest10(void)
PASS;
}
+static int StreamingBufferTest11(void)
+{
+ StreamingBufferConfig cfg = { 24, 1, STREAMING_BUFFER_REGION_GAP_DEFAULT, NULL, NULL, NULL };
+ StreamingBuffer *sb = StreamingBufferInit(&cfg);
+ FAIL_IF(sb == NULL);
+
+ StreamingBufferSegment seg1;
+ FAIL_IF(StreamingBufferAppend(sb, &cfg, &seg1, (const uint8_t *)"ABCDEFGH", 8) != 0);
+ StreamingBufferSegment seg2;
+ unsigned int data_len = 0xffffffff;
+ FAIL_IF(StreamingBufferAppend(sb, &cfg, &seg2, (const uint8_t *)"unused", data_len) != -1);
+ FAIL_IF(StreamingBufferInsertAt(
+ sb, &cfg, &seg2, (const uint8_t *)"abcdefghij", data_len, 100000) != SC_ELIMIT);
+ StreamingBufferFree(sb, &cfg);
+ PASS;
+}
#endif
void StreamingBufferRegisterTests(void)
@@ -2333,5 +2375,6 @@ void StreamingBufferRegisterTests(void)
UtRegisterTest("StreamingBufferTest08", StreamingBufferTest08);
UtRegisterTest("StreamingBufferTest09", StreamingBufferTest09);
UtRegisterTest("StreamingBufferTest10", StreamingBufferTest10);
+ UtRegisterTest("StreamingBufferTest11 Bug 6903", StreamingBufferTest11);
#endif
}