From 7e3c15e54a293a66e59a22ace9ea05f513086187 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Sat, 26 Nov 2011 00:42:41 +0100 Subject: [PATCH] stream: improve TCP ssn reuse cleanup. --- src/app-layer-parser.c | 3 +++ src/stream-tcp.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/app-layer-parser.c b/src/app-layer-parser.c index 03da2bef61..00a5b4bae3 100644 --- a/src/app-layer-parser.c +++ b/src/app-layer-parser.c @@ -176,6 +176,9 @@ static int AlpStoreField(AppLayerParserResult *output, uint16_t idx, void AppLayerSetEOF(Flow *f) { + if (f == NULL || f->aldata == NULL) + return; + AppLayerParserStateStore *parser_state_store = (AppLayerParserStateStore *)f->aldata[app_layer_sid]; if (parser_state_store != NULL) { diff --git a/src/stream-tcp.c b/src/stream-tcp.c index 2a8d8fa6f2..327a581cc3 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -3608,6 +3608,28 @@ static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt, { SCLogDebug("reusing closed TCP session"); + /* return segments */ + StreamTcpReturnStreamSegments(&ssn->client); + StreamTcpReturnStreamSegments(&ssn->server); + /* free SACK list */ + StreamTcpSackFreeList(&ssn->client); + StreamTcpSackFreeList(&ssn->server); + /* reset the app layer state */ + AppLayerParserCleanupState(p->flow); + FlowL7DataPtrInit(p->flow); + + ssn->state = 0; + ssn->flags = 0; + ssn->client.flags = 0; + ssn->server.flags = 0; + + /* set state the NONE, also pulls flow out of closed queue */ + StreamTcpPacketSetState(p, ssn, TCP_NONE); + + p->flow->alproto = ALPROTO_UNKNOWN; + p->flow->flags &= ~FLOW_TS_PM_PP_ALPROTO_DETECT_DONE; + p->flow->flags &= ~FLOW_TS_PM_PP_ALPROTO_DETECT_DONE; + if (StreamTcpPacketStateNone(tv,p,stt,ssn, &stt->pseudo_queue)) { goto error; }