Hi Sada, Thanks for the patch, Willy, can you apply ?
BR, Thierry On Fri, 11 May 2018 11:48:18 -0700 sada <s...@signalsciences.com> wrote: > Function `hlua_socke_close` expected exactly one argument on the Lua stack. > But when `hlua_socket_close` was called from `hlua_socket_write_yield`, > Lua stack had 3 arguments. So `hlua_socket_close` threw the exception with > message "'close' needs 1 arguments". > > Introduced new helper function `hlua_socket_close_helper`, which removed the > Lua stack argument count check and only checked if the first argument was > a socket. > > This fix should be backported to 1.8, 1.7 and 1.6. > --- > src/hlua.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/src/hlua.c b/src/hlua.c > index d07e8d67..8cc30513 100644 > --- a/src/hlua.c > +++ b/src/hlua.c > @@ -1629,14 +1629,12 @@ __LJMP static int hlua_socket_gc(lua_State *L) > /* The close function send shutdown signal and break the > * links between the stream and the object. > */ > -__LJMP static int hlua_socket_close(lua_State *L) > +__LJMP static int hlua_socket_close_helper(lua_State *L) > { > struct hlua_socket *socket; > struct appctx *appctx; > struct xref *peer; > > - MAY_LJMP(check_args(L, 1, "close")); > - > socket = MAY_LJMP(hlua_checksocket(L, 1)); > > /* Check if we run on the same thread than the xreator thread. > @@ -1659,6 +1657,14 @@ __LJMP static int hlua_socket_close(lua_State *L) > return 0; > } > > +/* The close function calls close_helper. > + */ > +__LJMP static int hlua_socket_close(lua_State *L) > +{ > + MAY_LJMP(check_args(L, 1, "close")); > + return hlua_socket_close_helper(L); > +} > + > /* This Lua function assumes that the stack contain three parameters. > * 1 - USERDATA containing a struct socket > * 2 - INTEGER with values of the macro defined below > @@ -1990,7 +1996,7 @@ static int hlua_socket_write_yield(struct lua_State > *L,int status, lua_KContext > if (len == -1) > s->req.flags |= CF_WAKE_WRITE; > > - MAY_LJMP(hlua_socket_close(L)); > + MAY_LJMP(hlua_socket_close_helper(L)); > lua_pop(L, 1); > lua_pushinteger(L, -1); > xref_unlock(&socket->xref, peer); > -- > 2.17.0 > >
>From 7034eef0ed9afefde6a2ff94ce6acfa63caa1832 Mon Sep 17 00:00:00 2001 From: sada <s...@signalsciences.com> Date: Fri, 11 May 2018 11:48:18 -0700 Subject: [PATCH] BUG/MINOR: lua: Socket.send threw runtime error: 'close' needs 1 arguments. Function `hlua_socke_close` expected exactly one argument on the Lua stack. But when `hlua_socket_close` was called from `hlua_socket_write_yield`, Lua stack had 3 arguments. So `hlua_socket_close` threw the exception with message "'close' needs 1 arguments". Introduced new helper function `hlua_socket_close_helper`, which removed the Lua stack argument count check and only checked if the first argument was a socket. This fix should be backported to 1.8, 1.7 and 1.6. --- src/hlua.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hlua.c b/src/hlua.c index 3845a11bb..cb683fa19 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1629,14 +1629,12 @@ __LJMP static int hlua_socket_gc(lua_State *L) /* The close function send shutdown signal and break the * links between the stream and the object. */ -__LJMP static int hlua_socket_close(lua_State *L) +__LJMP static int hlua_socket_close_helper(lua_State *L) { struct hlua_socket *socket; struct appctx *appctx; struct xref *peer; - MAY_LJMP(check_args(L, 1, "close")); - socket = MAY_LJMP(hlua_checksocket(L, 1)); /* Check if we run on the same thread than the xreator thread. @@ -1659,6 +1657,14 @@ __LJMP static int hlua_socket_close(lua_State *L) return 0; } +/* The close function calls close_helper. + */ +__LJMP static int hlua_socket_close(lua_State *L) +{ + MAY_LJMP(check_args(L, 1, "close")); + return hlua_socket_close_helper(L); +} + /* This Lua function assumes that the stack contain three parameters. * 1 - USERDATA containing a struct socket * 2 - INTEGER with values of the macro defined below @@ -1992,7 +1998,7 @@ static int hlua_socket_write_yield(struct lua_State *L,int status, lua_KContext if (len == -1) s->req.flags |= CF_WAKE_WRITE; - MAY_LJMP(hlua_socket_close(L)); + MAY_LJMP(hlua_socket_close_helper(L)); lua_pop(L, 1); lua_pushinteger(L, -1); xref_unlock(&socket->xref, peer); -- 2.16.3