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 f2b6620..d7afb58 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -1258,7 +1258,9 @@
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 @@
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 @@
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 @@
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;
}