BUG/MEDIUM: lua: the function txn_done() from action wrapper can crash

If an action wrapper stops the processing of the transaction
with a txn_done() function, the return code of the action is
"continue". So the continue can implies the processing of other
like adding headers. However, the HTTP content is flushed and
a segfault occurs.

This patchs add a flag indicating that the Lua code want to
stop the processing, ths flags is forwarded to the haproxy core,
and other actions are ignored.

Must be backported in 1.6
This commit is contained in:
Thierry FOURNIER 2016-07-14 11:45:33 +02:00 committed by Willy Tarreau
parent ab00df6cf6
commit 9bd52d478b
2 changed files with 6 additions and 0 deletions

View File

@ -31,6 +31,7 @@ struct stream;
#define HLUA_WAKEREQWR 0x00000008
#define HLUA_EXIT 0x00000010
#define HLUA_MUST_GC 0x00000020
#define HLUA_STOP 0x00000040
#define HLUA_F_AS_STRING 0x01
#define HLUA_F_MAY_USE_HTTP 0x02

View File

@ -4810,10 +4810,12 @@ __LJMP static int hlua_txn_set_mark(lua_State *L)
__LJMP static int hlua_txn_done(lua_State *L)
{
struct hlua_txn *htxn;
struct hlua *hlua;
struct channel *ic, *oc;
MAY_LJMP(check_args(L, 1, "close"));
htxn = MAY_LJMP(hlua_checktxn(L, 1));
hlua = hlua_gethlua(L);
/* If the flags NOTERM is set, we cannot terminate the http
* session, so we just end the execution of the current
@ -4857,6 +4859,7 @@ __LJMP static int hlua_txn_done(lua_State *L)
ic->analysers = 0;
hlua->flags |= HLUA_STOP;
WILL_LJMP(hlua_done(L));
return 0;
}
@ -5555,6 +5558,8 @@ static enum act_return hlua_action(struct act_rule *rule, struct proxy *px,
case HLUA_E_OK:
if (!hlua_check_proto(s, dir))
return ACT_RET_ERR;
if (s->hlua.flags & HLUA_STOP)
return ACT_RET_STOP;
return ACT_RET_CONT;
/* yield. */