diff --git a/src/app-layer-dcerpc-udp.c b/src/app-layer-dcerpc-udp.c index 9dedeee59e..e42c96804e 100644 --- a/src/app-layer-dcerpc-udp.c +++ b/src/app-layer-dcerpc-udp.c @@ -714,6 +714,10 @@ static int DCERPCUDPParse(Flow *f, void *dcerpc_state, int hdrretval = 0; SCEnter(); + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + DCERPCUDPState *sstate = (DCERPCUDPState *) dcerpc_state; while (sstate->bytesprocessed < DCERPC_UDP_HDR_LEN && input_len) { hdrretval = DCERPCUDPParseHeader(f, dcerpc_state, pstate, input, diff --git a/src/app-layer-dcerpc.c b/src/app-layer-dcerpc.c index d7198ba586..bbfb330067 100644 --- a/src/app-layer-dcerpc.c +++ b/src/app-layer-dcerpc.c @@ -1911,6 +1911,10 @@ static int DCERPCParse(Flow *f, void *dcerpc_state, int32_t retval = 0; DCERPCState *sstate = (DCERPCState *) dcerpc_state; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + if (sstate->dcerpc.bytesprocessed != 0 && sstate->data_needed_for_dir != dir) { SCReturnInt(-1); } diff --git a/src/app-layer-dns-tcp.c b/src/app-layer-dns-tcp.c index 840a0f8086..80a48507ee 100644 --- a/src/app-layer-dns-tcp.c +++ b/src/app-layer-dns-tcp.c @@ -280,12 +280,16 @@ static int DNSTCPRequestParse(Flow *f, void *dstate, DNSState *dns_state = (DNSState *)dstate; SCLogDebug("starting %u", input_len); + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + /** \todo remove this when PP is fixed to enforce ipproto */ if (f != NULL && f->proto != IPPROTO_TCP) SCReturnInt(-1); /* probably a rst/fin sending an eof */ - if (input_len == 0) { + if (input == NULL || input_len == 0) { goto insufficient_data; } @@ -490,6 +494,10 @@ static int DNSTCPResponseParse(Flow *f, void *dstate, { DNSState *dns_state = (DNSState *)dstate; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + /** \todo remove this when PP is fixed to enforce ipproto */ if (f != NULL && f->proto != IPPROTO_TCP) SCReturnInt(-1); diff --git a/src/app-layer-dns-udp.c b/src/app-layer-dns-udp.c index eb87849c52..e3ee01ffab 100644 --- a/src/app-layer-dns-udp.c +++ b/src/app-layer-dns-udp.c @@ -62,11 +62,15 @@ static int DNSUDPRequestParse(Flow *f, void *dstate, SCLogDebug("starting %u", input_len); + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + /** \todo remove this when PP is fixed to enforce ipproto */ if (f != NULL && f->proto != IPPROTO_UDP) SCReturnInt(-1); - if (input_len == 0 || input_len < sizeof(DNSHeader)) { + if (input == NULL || input_len == 0 || input_len < sizeof(DNSHeader)) { SCLogDebug("ilen too small, hoped for at least %"PRIuMAX, (uintmax_t)sizeof(DNSHeader)); goto insufficient_data; } @@ -168,11 +172,15 @@ static int DNSUDPResponseParse(Flow *f, void *dstate, SCLogDebug("starting %u", input_len); + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + /** \todo remove this when PP is fixed to enforce ipproto */ if (f != NULL && f->proto != IPPROTO_UDP) SCReturnInt(-1); - if (input_len == 0 || input_len < sizeof(DNSHeader)) { + if (input == NULL || input_len == 0 || input_len < sizeof(DNSHeader)) { SCLogDebug("ilen too small, hoped for at least %"PRIuMAX, (uintmax_t)sizeof(DNSHeader)); goto insufficient_data; } diff --git a/src/app-layer-ftp.c b/src/app-layer-ftp.c index b4a4d6f8e8..1ba1844615 100644 --- a/src/app-layer-ftp.c +++ b/src/app-layer-ftp.c @@ -219,6 +219,10 @@ static int FTPParseRequest(Flow *f, void *ftp_state, FtpState *state = (FtpState *)ftp_state; void *ptmp; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + state->input = input; state->input_len = input_len; /* toserver stream */ diff --git a/src/app-layer-modbus.c b/src/app-layer-modbus.c index 16ab40d0b0..9e9ba03741 100644 --- a/src/app-layer-modbus.c +++ b/src/app-layer-modbus.c @@ -1227,6 +1227,10 @@ static int ModbusParseRequest(Flow *f, ModbusTransaction *tx; ModbusHeader header; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + while (input_len > 0) { uint32_t adu_len = input_len; uint8_t *adu = input; @@ -1284,6 +1288,10 @@ static int ModbusParseResponse(Flow *f, ModbusState *modbus = (ModbusState *) state; ModbusTransaction *tx; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + while (input_len > 0) { uint32_t adu_len = input_len; uint8_t *adu = input; diff --git a/src/app-layer-smb.c b/src/app-layer-smb.c index b7ae55d3d1..c502103152 100644 --- a/src/app-layer-smb.c +++ b/src/app-layer-smb.c @@ -1172,6 +1172,10 @@ static int SMBParse(Flow *f, void *smb_state, AppLayerParserState *pstate, SCReturnInt(0); } + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + if (sstate->bytesprocessed != 0 && sstate->data_needed_for_dir != dir) { SCReturnInt(-1); } diff --git a/src/app-layer-smb2.c b/src/app-layer-smb2.c index 6a49bd751c..3c591e913a 100644 --- a/src/app-layer-smb2.c +++ b/src/app-layer-smb2.c @@ -532,6 +532,10 @@ static int SMB2Parse(Flow *f, void *smb2_state, AppLayerParserState *pstate, if (pstate == NULL) return -1; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + while (sstate->bytesprocessed < NBSS_HDR_LEN && input_len) { retval = NBSSParseHeader(smb2_state, pstate, input, input_len); if (retval <= input_len) { diff --git a/src/app-layer-smtp.c b/src/app-layer-smtp.c index bbfa7ae932..7f398a6e7d 100644 --- a/src/app-layer-smtp.c +++ b/src/app-layer-smtp.c @@ -1065,6 +1065,10 @@ static int SMTPParse(int direction, Flow *f, SMTPState *state, { SCEnter(); + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + state->input = input; state->input_len = input_len; state->direction = direction; diff --git a/src/app-layer-ssh.c b/src/app-layer-ssh.c index 9d610b8c6b..fda60c1cf5 100644 --- a/src/app-layer-ssh.c +++ b/src/app-layer-ssh.c @@ -422,6 +422,10 @@ static int SSHParseRequest(Flow *f, void *state, AppLayerParserState *pstate, SshState *ssh_state = (SshState *)state; SshHeader *ssh_header = &ssh_state->cli_hdr; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + int r = SSHParseData(ssh_state, ssh_header, input, input_len); if (ssh_state->cli_hdr.flags & SSH_FLAG_PARSER_DONE && @@ -440,6 +444,10 @@ static int SSHParseResponse(Flow *f, void *state, AppLayerParserState *pstate, SshState *ssh_state = (SshState *)state; SshHeader *ssh_header = &ssh_state->srv_hdr; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + int r = SSHParseData(ssh_state, ssh_header, input, input_len); if (ssh_state->cli_hdr.flags & SSH_FLAG_PARSER_DONE && diff --git a/src/app-layer-ssl.c b/src/app-layer-ssl.c index d980b00abd..0800c1db3d 100644 --- a/src/app-layer-ssl.c +++ b/src/app-layer-ssl.c @@ -974,6 +974,10 @@ static int SSLDecode(Flow *f, uint8_t direction, void *alstate, AppLayerParserSt ssl_state->f = f; + if (input == NULL && AppLayerParserStateIssetFlag(pstate, APP_LAYER_PARSER_EOF)) { + SCReturnInt(1); + } + if (direction == 0) ssl_state->curr_connp = &ssl_state->client_connp; else