From: Christopher Faulet Date: Wed, 3 Jun 2020 16:39:16 +0000 (+0200) Subject: BUG/MEDIUM: hlua: Lock pattern references to perform set/add/del operations X-Git-Tag: v2.2-dev9~156 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5cf2dfc5fd08b7ff8d27d6293e2aaa8ec18fc607;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: hlua: Lock pattern references to perform set/add/del operations The pattern references lock must be hold to perform set/add/del operations. Unfortunately, it is not true for the lua functions manipulating acl and map files. This patch should fix the issue #664. It must be backported as far as 1.8. --- diff --git a/src/hlua.c b/src/hlua.c index f2b6620448..d7afb5817a 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -1258,7 +1258,9 @@ __LJMP static int hlua_del_acl(lua_State *L) if (!ref) WILL_LJMP(luaL_error(L, "'del_acl': unknown acl file '%s'", name)); + HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); pat_ref_delete(ref, key); + HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); return 0; } @@ -1280,7 +1282,9 @@ static int hlua_del_map(lua_State *L) if (!ref) WILL_LJMP(luaL_error(L, "'del_map': unknown acl file '%s'", name)); + HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); pat_ref_delete(ref, key); + HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); return 0; } @@ -1302,8 +1306,10 @@ static int hlua_add_acl(lua_State *L) if (!ref) WILL_LJMP(luaL_error(L, "'add_acl': unknown acl file '%s'", name)); + HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); if (pat_ref_find_elt(ref, key) == NULL) pat_ref_add(ref, key, NULL, NULL); + HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); return 0; } @@ -1328,10 +1334,12 @@ static int hlua_set_map(lua_State *L) if (!ref) WILL_LJMP(luaL_error(L, "'set_map': unknown map file '%s'", name)); + HA_SPIN_LOCK(PATREF_LOCK, &ref->lock); if (pat_ref_find_elt(ref, key) != NULL) pat_ref_set(ref, key, value, NULL); else pat_ref_add(ref, key, value, NULL); + HA_SPIN_UNLOCK(PATREF_LOCK, &ref->lock); return 0; }