]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: httpclient/lua: double LIST_DELETE on end of lua task
authorWilliam Lallemand <wlallemand@haproxy.org>
Thu, 8 Dec 2022 10:11:36 +0000 (11:11 +0100)
committerWilliam Lallemand <wlallemand@haproxy.org>
Thu, 8 Dec 2022 10:30:03 +0000 (11:30 +0100)
The lua httpclient cleanup can be called in 2 places, the
hlua_httpclient_gc() and the hlua_httpclient_destroy_all().

A LIST_DELETE() is performed to remove the hlua_hc struct of the list.
However, when the lua task ends and call hlua_ctx_destroy(), it does a
LIST_DELETE() first, and then the gc tries to do a LIST_DELETE() again
in hlua_httpclient_gc(), provoking a crash.

This patch fixes the issue by doing a LIST_DEL_INIT() instead of
LIST_DELETE() in both cases.

Should fix issue #1958.

Must be backported where bb58142 is backported.

src/hlua.c

index 35f9c8f56009a9ebe0a8843f16e017c46aa46faa..a0379914795abe5165bd42ae7d39fa5990e20261 100644 (file)
@@ -1279,7 +1279,7 @@ static void hlua_httpclient_destroy_all(struct hlua *hlua)
                if (hlua_hc->hc)
                        httpclient_stop_and_destroy(hlua_hc->hc);
                hlua_hc->hc = NULL;
-               LIST_DELETE(&hlua_hc->by_hlua);
+               LIST_DEL_INIT(&hlua_hc->by_hlua);
        }
 }
 
@@ -7033,10 +7033,8 @@ __LJMP static int hlua_httpclient_gc(lua_State *L)
        if (hlua_hc->hc)
                httpclient_stop_and_destroy(hlua_hc->hc);
 
-       LIST_DELETE(&hlua_hc->by_hlua);
-
        hlua_hc->hc = NULL;
-
+       LIST_DEL_INIT(&hlua_hc->by_hlua);
 
        return 0;
 }