`check_args` checked for the "exact number of" arguments available on the
Lua stack as
given in the second param(nb).

So `close` was expecting exactly "one" argument on the Lua stack.
But when `close` was called from xxx_write_yield(), Lua stack had 3
arguments.

So close threw the exception with message "'close' needs 1 arguments".

"close_helper" function removed the Lua stack argument count check and only
checked
if the first argument was a socket.

----
void check_args(lua_State *L, int nb, char *fcn)
{
if (lua_gettop(L) == nb)
return;
WILL_LJMP(luaL_error(L, "'%s' needs %d arguments", fcn, nb));
}
----

Please let me know if you need more information.
Thanks,
Sada.


On Thu, May 3, 2018 at 12:16 AM, Thierry Fournier <tfourn...@arpalert.org>
wrote:

> 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 <tfourn...@arpalert.org>
> 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 <
> s...@signalsciences.com> 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 <
> tfourn...@arpalert.org> 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 <s...@signalsciences.com> 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
> >>>
> >>
> >>
> >
>
>

Reply via email to