BUG/MINOR: hlua: Detect end of request when reading data for an HTTP applet

When a script retrieves request data from an HTTP applet, line per line or
not, we must be sure to properly detect the end of the request by checking
HTX_FL_EOM flag when everything was consumed. Otherwise, the script may
hang.

It is pretty easy to reproduce the bug by calling applet:receive() without
specifying any length. If the request is not chunked, the function never
returns.

The bug was introduced when the EOM block was removed. Thus, it is specific
to the 2.4. This patch should fix the issue #1207. No backport needed.
This commit is contained in:
Christopher Faulet 2021-04-02 14:24:56 +02:00
parent 8043e831d1
commit eccb31c939

View File

@ -4420,6 +4420,12 @@ __LJMP static int hlua_applet_http_getline_yield(lua_State *L, int status, lua_K
} }
} }
/* The message was fully consumed and no more data are expected
* (EOM flag set).
*/
if (htx_is_empty(htx) && (htx->flags & HTX_FL_EOM))
stop = 1;
htx_to_buf(htx, &req->buf); htx_to_buf(htx, &req->buf);
if (!stop) { if (!stop) {
si_cant_get(si); si_cant_get(si);
@ -4506,6 +4512,12 @@ __LJMP static int hlua_applet_http_recv_yield(lua_State *L, int status, lua_KCon
} }
} }
/* The message was fully consumed and no more data are expected
* (EOM flag set).
*/
if (htx_is_empty(htx) && (htx->flags & HTX_FL_EOM))
len = 0;
htx_to_buf(htx, &req->buf); htx_to_buf(htx, &req->buf);
/* If we are no other data available, yield waiting for new data. */ /* If we are no other data available, yield waiting for new data. */