app-layer: update all protocols to accept NULL+EOF

Update all non-HTTP protocol parsers to accept a NULL+EOF input.
pull/1562/head
Victor Julien 10 years ago
parent cf9ff6adbd
commit 4e7cb7b863

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

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

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

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

@ -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 */

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

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

@ -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) {

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

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

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

Loading…
Cancel
Save