|
commit 2351ca211d655c1be9ef6d62880899102134266d
|
|
Author: Christopher Faulet <cfaulet@haproxy.com>
|
|
Date: Fri Jul 26 16:31:34 2019 +0200
|
|
|
|
BUG/MINOR: hlua: Only execute functions of HTTP class if the txn is HTTP ready
|
|
|
|
The flag HLUA_TXN_HTTP_RDY was added in the previous commit to know when a
|
|
function is called for a channel with a valid HTTP message or not. Of course it
|
|
also depends on the calling direction. In this commit, we allow the execution of
|
|
functions of the HTTP class only if this flag is set.
|
|
|
|
Nobody seems to use them from an unsupported context (for instance, trying to
|
|
set an HTTP header from a tcp-request rule). But it remains a bug leading to
|
|
undefined behaviors or crashes.
|
|
|
|
This patch may be backported to all versions since the 1.6. It depends on the
|
|
commits "MINOR: hlua: Add a flag on the lua txn to know in which context it can
|
|
be used" and "MINOR: hlua: Don't set request analyzers on response channel for
|
|
lua actions".
|
|
|
|
(cherry picked from commit 301eff8e215d5dc7130e1ebacd7cf8da09a4f643)
|
|
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
|
|
|
|
diff --git a/src/hlua.c b/src/hlua.c
|
|
index d37e3c61..4d92fa44 100644
|
|
--- a/src/hlua.c
|
|
+++ b/src/hlua.c
|
|
@@ -5346,7 +5346,7 @@ __LJMP static int hlua_http_req_get_headers(lua_State *L)
|
|
MAY_LJMP(check_args(L, 1, "req_get_headers"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_get_headers(L, htxn, &htxn->s->txn->req);
|
|
@@ -5359,7 +5359,7 @@ __LJMP static int hlua_http_res_get_headers(lua_State *L)
|
|
MAY_LJMP(check_args(L, 1, "res_get_headers"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_get_headers(L, htxn, &htxn->s->txn->rsp);
|
|
@@ -5399,7 +5399,7 @@ __LJMP static int hlua_http_req_rep_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 4, "req_rep_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return MAY_LJMP(hlua_http_rep_hdr(L, htxn, &htxn->s->txn->req, ACT_HTTP_REPLACE_HDR));
|
|
@@ -5412,7 +5412,7 @@ __LJMP static int hlua_http_res_rep_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 4, "res_rep_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return MAY_LJMP(hlua_http_rep_hdr(L, htxn, &htxn->s->txn->rsp, ACT_HTTP_REPLACE_HDR));
|
|
@@ -5425,7 +5425,7 @@ __LJMP static int hlua_http_req_rep_val(lua_State *L)
|
|
MAY_LJMP(check_args(L, 4, "req_rep_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return MAY_LJMP(hlua_http_rep_hdr(L, htxn, &htxn->s->txn->req, ACT_HTTP_REPLACE_VAL));
|
|
@@ -5438,7 +5438,7 @@ __LJMP static int hlua_http_res_rep_val(lua_State *L)
|
|
MAY_LJMP(check_args(L, 4, "res_rep_val"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return MAY_LJMP(hlua_http_rep_hdr(L, htxn, &htxn->s->txn->rsp, ACT_HTTP_REPLACE_VAL));
|
|
@@ -5480,7 +5480,7 @@ __LJMP static int hlua_http_req_del_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 2, "req_del_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_del_hdr(L, htxn, &htxn->s->txn->req);
|
|
@@ -5493,7 +5493,7 @@ __LJMP static int hlua_http_res_del_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 2, "res_del_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_del_hdr(L, htxn, &htxn->s->txn->rsp);
|
|
@@ -5547,7 +5547,7 @@ __LJMP static int hlua_http_req_add_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 3, "req_add_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_add_hdr(L, htxn, &htxn->s->txn->req);
|
|
@@ -5560,7 +5560,7 @@ __LJMP static int hlua_http_res_add_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 3, "res_add_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
return hlua_http_add_hdr(L, htxn, &htxn->s->txn->rsp);
|
|
@@ -5573,7 +5573,7 @@ static int hlua_http_req_set_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 3, "req_set_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
hlua_http_del_hdr(L, htxn, &htxn->s->txn->req);
|
|
@@ -5587,7 +5587,7 @@ static int hlua_http_res_set_hdr(lua_State *L)
|
|
MAY_LJMP(check_args(L, 3, "res_set_hdr"));
|
|
htxn = MAY_LJMP(hlua_checkhttp(L, 1));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
hlua_http_del_hdr(L, htxn, &htxn->s->txn->rsp);
|
|
@@ -5601,7 +5601,7 @@ static int hlua_http_req_set_meth(lua_State *L)
|
|
size_t name_len;
|
|
const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
lua_pushboolean(L, http_replace_req_line(0, name, name_len, htxn->p, htxn->s) != -1);
|
|
@@ -5615,7 +5615,7 @@ static int hlua_http_req_set_path(lua_State *L)
|
|
size_t name_len;
|
|
const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
lua_pushboolean(L, http_replace_req_line(1, name, name_len, htxn->p, htxn->s) != -1);
|
|
@@ -5629,7 +5629,7 @@ static int hlua_http_req_set_query(lua_State *L)
|
|
size_t name_len;
|
|
const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
/* Check length. */
|
|
@@ -5656,7 +5656,7 @@ static int hlua_http_req_set_uri(lua_State *L)
|
|
size_t name_len;
|
|
const char *name = MAY_LJMP(luaL_checklstring(L, 2, &name_len));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_REQ)
|
|
+ if (htxn->dir != SMP_OPT_DIR_REQ || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
lua_pushboolean(L, http_replace_req_line(3, name, name_len, htxn->p, htxn->s) != -1);
|
|
@@ -5670,7 +5670,7 @@ static int hlua_http_res_set_status(lua_State *L)
|
|
unsigned int code = MAY_LJMP(luaL_checkinteger(L, 2));
|
|
const char *reason = MAY_LJMP(luaL_optlstring(L, 3, NULL, NULL));
|
|
|
|
- if (htxn->dir != SMP_OPT_DIR_RES)
|
|
+ if (htxn->dir != SMP_OPT_DIR_RES || !(htxn->flags & HLUA_TXN_HTTP_RDY))
|
|
WILL_LJMP(lua_error(L));
|
|
|
|
http_set_status(code, reason, htxn->s);
|