]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream: stricter check inserting segments
authorVictor Julien <vjulien@oisf.net>
Thu, 17 Nov 2022 13:59:30 +0000 (14:59 +0100)
committerVictor Julien <vjulien@oisf.net>
Wed, 30 Nov 2022 05:48:24 +0000 (06:48 +0100)
In lossy streams, esp where TcpSession::lossy_be_liberal it is possible
to end up inserting a segment that is out of the expected sequence
number bounds.

src/stream-tcp-list.c

index 768d75e8ed3590cd363dab861b055dd87d0e93b3..e5024e7338ca6d1e8654f8dab98ddbf0dc37a640 100644 (file)
@@ -163,10 +163,15 @@ static inline bool CheckOverlap(struct TCPSEG *tree, TcpSegment *seg)
  *  \retval 2 not inserted, data overlap
  *  \retval 1 inserted with overlap detected
  *  \retval 0 inserted, no overlap
+ *  \retval -ENOMEM memcap reached
+ *  \retval -EINVAL seg out of seq range
  */
 static int DoInsertSegment (TcpStream *stream, TcpSegment *seg, TcpSegment **dup_seg, Packet *p)
 {
-    BUG_ON(SEQ_LEQ(SEG_SEQ_RIGHT_EDGE(seg), stream->base_seq));
+    /* in lossy traffic, we can get here with the wrong sequence numbers */
+    if (SEQ_LEQ(SEG_SEQ_RIGHT_EDGE(seg), stream->base_seq)) {
+        return -EINVAL;
+    }
 
     /* fast track */
     if (RB_EMPTY(&stream->seg_tree)) {