BUG/MEDIUM: lua: In some case, the return of sample-fetche is ignored

When:

 - A Lua action return data and close the channel. The request status
   is set to HTTP_MSG_CLOSED for the request and HTTP_MSG_DONE for the
   response.

 - HAProxy sets the state HTTP_MSG_ERROR. I don't known why, because
   there are many line which sets this state.

 - A Lua sample-fetch is executed, typically for building the log
   line.

 - When the Lua sample fetch exits, a control of the data is
   executed. If HAProxy is currently parsing the request, the request
   is aborted in order to prevent a segfault or sending corrupted
   data.

This ast control is executed comparing the state HTTP_MSG_BODY. When
this state is reached, the request is parsed and no error are
possible. When the state is < than HTTP_MSG_BODY, the parser is
running.

Unfortunately, the code HTTP_MSG_ERROR is just < HTTP_MSG_BODY. When
we are in error, we want to terminate the execution of Lua without
error.

This patch changes the comparaison level.

This patch must be backported in 1.6
This commit is contained in:
Thierry FOURNIER / OZON.IO 2016-11-18 19:06:21 +01:00 committed by Willy Tarreau
parent 2fe1b92163
commit 8dc7316a6f

View File

@ -2413,13 +2413,13 @@ static int hlua_check_proto(struct stream *stream, int dir)
if (stream->be->mode == PR_MODE_HTTP) {
if (dir == SMP_OPT_DIR_REQ &&
!(stream->req.analysers & AN_REQ_WAIT_HTTP) &&
stream->txn->req.msg_state < HTTP_MSG_BODY) {
stream->txn->req.msg_state < HTTP_MSG_ERROR) {
stream_int_retnclose(&stream->si[0], &msg);
return 0;
}
else if (dir == SMP_OPT_DIR_RES &&
!(stream->res.analysers & AN_RES_WAIT_HTTP) &&
stream->txn->rsp.msg_state < HTTP_MSG_BODY) {
stream->txn->rsp.msg_state < HTTP_MSG_ERROR) {
stream_int_retnclose(&stream->si[0], &msg);
return 0;
}