This function checks that one argument are present in the stack, at the bottom of the stack (position 1).
MAY_LJMP(check_args(L, 1, "close")); The stack is kept between calls, so the position 1 will contains anything. The content of the position 1 in the stack is a struct associated with the socket object. The function close is called byt the function xxx_write() which is a callback of the Lua function “send()”. This send function have the same same first argument then the Lua function "close()”, so the stack contains a socket object at position 1. I’m sure because the following line, just after the stack check gets this argument: socket = MAY_LJMP(hlua_checksocket(L, 1)); If your patch works, this is a proof that the stack contains expected value at position 1, so removing the stack check doesn’t fix anything. Maybe I miss something, or you encounters a bug caused by anything else. Do you have a method for reproducing a bug ? BR, Thierry > On 3 May 2018, at 08:56, Thierry Fournier <[email protected]> wrote: > > Hi, > > I’m not sure about your patch because the values in the stack are kept. > I need to be focus to read it, and unfortunately I’m very busy. > I try to check this morning, during the french strikes... > > Thierry > > >> On 25 Apr 2018, at 20:26, Sadasiva Gujjarlapudi <[email protected]> >> wrote: >> >> cc: Haproxy >> >> `hlua_socket_close` expected exactly one argument on stack. >> But when it was called from `hlua_socket_write_yield`, it found more than >> one argument on stack and threw an error. >> >> This patch introduced new helper function `hlua_socket_close_helper`, which >> doesn't check arguments count. >> Please let me know if you need more information. >> >> Thanks, >> Sada. >> >> >> On Wed, Apr 25, 2018 at 10:51 AM, Thierry Fournier <[email protected]> >> wrote: >> Hi, >> >> do you have a little bit of context. It is not easy to read a patch without >> the associated explanation. >> >> Thanks, >> Thierry >> >> >> >>> On 14 Apr 2018, at 01:56, sada <[email protected]> wrote: >>> >>> --- >>> src/hlua.c | 14 ++++++++++---- >>> 1 file changed, 10 insertions(+), 4 deletions(-) >>> >>> diff --git a/src/hlua.c b/src/hlua.c >>> index 60cf8f94..0585a1e7 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 >>> >> >> >

