frames: do not rely on FRAME_STREAM_ID

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.

Resorting on FRAME_STREAM_TYPE is more consistent.

Ticket: 7213
pull/11755/head
Philippe Antoine 2 months ago committed by Victor Julien
parent 0ebb84538e
commit 89d229c76f

@ -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;

@ -1210,7 +1210,7 @@ static void HandleStreamFrames(Flow *f, StreamSlice stream_slice, const uint8_t
if (((direction == 0 && (pstate->flags & APP_LAYER_PARSER_SFRAME_TS) == 0) ||
(direction == 1 && (pstate->flags & APP_LAYER_PARSER_SFRAME_TC) == 0)) &&
input != NULL && f->proto == IPPROTO_TCP) {
Frame *frame = AppLayerFrameGetById(f, direction, FRAME_STREAM_ID);
Frame *frame = AppLayerFrameGetLastOpenByType(f, direction, FRAME_STREAM_TYPE);
if (frame == NULL) {
int64_t frame_len = -1;
if (flags & STREAM_EOF)
@ -1231,7 +1231,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);
Frame *frame = AppLayerFrameGetLastOpenByType(f, direction, FRAME_STREAM_TYPE);
SCLogDebug("EOF closing: frame %p", frame);
if (frame) {
/* calculate final frame length */

Loading…
Cancel
Save