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

Reply via email to