Skip to content

Commit

Permalink
frames: do not only rely on FRAME_STREAM_ID
Browse files Browse the repository at this point in the history
As it is not always the first frame to be created :
if it is not enabled, it does not get created, and other enabled
frames may be created first. see use of FrameConfigTypeIsEnabled

This resulted that this other frame got its length updated
on stream end, which led to false positives.

Also checking FRAME_STREAM_TYPE is more consistent.

Not a clean cherry-pick as AppLayerFrameGetLastOpenByType
does not exist in main7

Ticket: 7213
  • Loading branch information
catenacyber committed Sep 12, 2024
1 parent 98fd40a commit 67d6e3e
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 4 deletions.
2 changes: 0 additions & 2 deletions src/app-layer-frames.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@

/** max 63 to fit the 64 bit per protocol space */
#define FRAME_STREAM_TYPE 63
/** always the first frame to be created. TODO but what about protocol upgrades? */
#define FRAME_STREAM_ID 1

typedef int64_t FrameId;

Expand Down
7 changes: 5 additions & 2 deletions src/app-layer-parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -1238,6 +1238,9 @@ static inline void SetEOFFlags(AppLayerParserState *pstate, const uint8_t flags)
}
}

// if there is a stream frame, it should always be the first
#define FRAME_STREAM_ID 1

/** \internal
* \brief create/close stream frames
* On first invocation of TCP parser in a direction, create a <alproto>.stream frame.
Expand All @@ -1253,7 +1256,7 @@ static void HandleStreamFrames(Flow *f, StreamSlice stream_slice, const uint8_t
(direction == 1 && (pstate->flags & APP_LAYER_PARSER_SFRAME_TC) == 0)) &&
input != NULL && f->proto == IPPROTO_TCP) {
Frame *frame = AppLayerFrameGetById(f, direction, FRAME_STREAM_ID);
if (frame == NULL) {
if (frame == NULL || frame->type != FRAME_STREAM_TYPE) {
int64_t frame_len = -1;
if (flags & STREAM_EOF)
frame_len = input_len;
Expand All @@ -1275,7 +1278,7 @@ static void HandleStreamFrames(Flow *f, StreamSlice stream_slice, const uint8_t
} else if (flags & STREAM_EOF) {
Frame *frame = AppLayerFrameGetById(f, direction, FRAME_STREAM_ID);
SCLogDebug("EOF closing: frame %p", frame);
if (frame) {
if (frame || frame->type != FRAME_STREAM_TYPE) {
/* calculate final frame length */
int64_t slice_o = (int64_t)stream_slice.offset - (int64_t)frame->offset;
int64_t frame_len = slice_o + (int64_t)input_len;
Expand Down

0 comments on commit 67d6e3e

Please # to comment.