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