app-layer: handle parser return code issues more gracefully

pull/5368/head
Victor Julien 5 years ago
parent 5155982ba5
commit fbdc776525

@ -1235,15 +1235,25 @@ int AppLayerParserParse(ThreadVars *tv, AppLayerParserThreadCtx *alp_tctx, Flow
input, input_len,
alp_tctx->alproto_local_storage[f->protomap][alproto],
flags);
if (res.status < 0)
{
if (res.status < 0) {
goto error;
} else if (res.status > 0) {
DEBUG_VALIDATE_BUG_ON(res.consumed > input_len);
DEBUG_VALIDATE_BUG_ON(res.needed + res.consumed < input_len);
DEBUG_VALIDATE_BUG_ON(res.needed == 0);
/* incomplete is only supported for TCP */
DEBUG_VALIDATE_BUG_ON(f->proto != IPPROTO_TCP);
/* put protocol in error state on improper use of the
* return codes. */
if (res.consumed > input_len || res.needed + res.consumed < input_len) {
goto error;
}
if (f->proto == IPPROTO_TCP && f->protoctx != NULL) {
TcpSession *ssn = f->protoctx;
SCLogDebug("direction %d/%s", direction,
(flags & STREAM_TOSERVER) ? "toserver" : "toclient");
BUG_ON(res.consumed > input_len);
if (direction == 0) {
/* parser told us how much data it needs on top of what it
* consumed. So we need tell stream engine how much we need
@ -1257,12 +1267,7 @@ int AppLayerParserParse(ThreadVars *tv, AppLayerParserThreadCtx *alp_tctx, Flow
ssn->server.data_required = res.needed;
SCLogDebug("setting data_required %u", ssn->server.data_required);
}
} else {
/* incomplete is only supported for TCP */
BUG_ON(f->proto != IPPROTO_TCP);
}
BUG_ON(res.needed + res.consumed < input_len);
BUG_ON(res.needed == 0);
consumed = res.consumed;
}
}

Loading…
Cancel
Save