]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream: count realloc in memcap
authorEric Leblond <eric@regit.org>
Mon, 8 Feb 2021 20:46:26 +0000 (21:46 +0100)
committerVictor Julien <vjulien@oisf.net>
Thu, 26 May 2022 10:45:15 +0000 (12:45 +0200)
TCP memory cap was not taking into account the memory that can
be used by realloc of Packet headers in TCP segments.

src/stream-tcp-list.c
src/stream-tcp-reassemble.c
src/stream-tcp-reassemble.h

index c7baca32180d5c97f8fffd3b4a764c3afec4fb9e..5bced3ede2e20b94aed33dcf4fd62dbe7c3d9f60 100644 (file)
@@ -595,9 +595,9 @@ static void StreamTcpSegmentAddPacketData(
          * need to check that this is sufficient and allocate more memory if
          * not.
          */
-        if (GET_PKT_LEN(rp) - p->payload_len > seg->pcap_hdr_storage->alloclen) {
-            uint8_t *tmp_pkt_hdr =
-                    SCRealloc(seg->pcap_hdr_storage->pkt_hdr, GET_PKT_LEN(rp) - p->payload_len);
+        if (seg->pcap_hdr_storage->pktlen > seg->pcap_hdr_storage->alloclen) {
+            uint8_t *tmp_pkt_hdr = StreamTcpReassembleRealloc(seg->pcap_hdr_storage->pkt_hdr,
+                    seg->pcap_hdr_storage->alloclen, seg->pcap_hdr_storage->pktlen);
             if (tmp_pkt_hdr == NULL) {
                 SCLogDebug("Failed to realloc");
                 seg->pcap_hdr_storage->ts.tv_sec = 0;
index ae8f7a80ec6b13c8294a95ed70491594fe6f1d86..bf634f5bb68e0720734193bf0d85e2d8ea85f6b5 100644 (file)
@@ -224,7 +224,7 @@ static void *ReassembleCalloc(size_t n, size_t size)
 /*
     void *(*Realloc)(void *ptr, size_t orig_size, size_t size);
 */
-static void *ReassembleRealloc(void *optr, size_t orig_size, size_t size)
+void *StreamTcpReassembleRealloc(void *optr, size_t orig_size, size_t size)
 {
     if (size > orig_size) {
         if (StreamTcpReassembleCheckMemcap(size - orig_size) == 0)
@@ -484,7 +484,7 @@ static int StreamTcpReassemblyConfig(bool quiet)
     stream_config.sbcnf.buf_size = 2048;
     stream_config.sbcnf.Malloc = ReassembleMalloc;
     stream_config.sbcnf.Calloc = ReassembleCalloc;
-    stream_config.sbcnf.Realloc = ReassembleRealloc;
+    stream_config.sbcnf.Realloc = StreamTcpReassembleRealloc;
     stream_config.sbcnf.Free = ReassembleFree;
 
     return 0;
index d62e27b045b22f3d619a1c6001da4c66b19a804d..e3ec460f2854fa95a0805144bc732a31f89a3ac2 100644 (file)
@@ -85,6 +85,7 @@ void StreamTcpReassembleInitMemuse(void);
 int StreamTcpReassembleHandleSegment(ThreadVars *, TcpReassemblyThreadCtx *, TcpSession *, TcpStream *, Packet *, PacketQueueNoLock *);
 int StreamTcpReassembleInit(bool);
 void StreamTcpReassembleFree(bool);
+void *StreamTcpReassembleRealloc(void *optr, size_t orig_size, size_t size);
 void StreamTcpReassembleRegisterTests(void);
 TcpReassemblyThreadCtx *StreamTcpReassembleInitThreadCtx(ThreadVars *tv);
 void StreamTcpReassembleFreeThreadCtx(TcpReassemblyThreadCtx *);