From: Thierry FOURNIER Date: Fri, 25 May 2018 13:03:50 +0000 (+0200) Subject: BUG/MAJOR: lua: Dead lock with sockets X-Git-Tag: v1.9-dev1~228 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7e4ee47accdb93925ddfc18cf6f181ff334abcdc;p=thirdparty%2Fhaproxy.git BUG/MAJOR: lua: Dead lock with sockets In some cases, when we are waiting for data and the socket timeout expires, we have a dead lock. The Lua socket locks the applet socket, and call for a notify. The notify immediately executes code and try to acquire the same lock, so ... dead lock. stream_int_notify() cant be used because it wakeup the applet task only if the stream have changes. The changes are forces by Lua, but not repported on the stream. stream_int_update_applet() cant be used because the deadlock. So, I inconditionnaly wakeup the applet. This wake is performed asynchronously, and will call a stream_int_notify(). This patch must be backported in 1.6, 1.7 and 1.8 --- diff --git a/src/hlua.c b/src/hlua.c index 03e961c378..48de5cba55 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1766,8 +1766,7 @@ __LJMP static int hlua_socket_receive_yield(struct lua_State *L, int status, lua co_skip(oc, len + skip_at_end); /* Don't wait anything. */ - stream_int_notify(&s->si[0]); - stream_int_update_applet(&s->si[0]); + appctx_wakeup(appctx); /* If the pattern reclaim to read all the data * in the connection, got out.