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.

(cherry picked from commit 5cf2dfc5fd08b7ff8d27d6293e2aaa8ec18fc607)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 1a97b5edef00991377ae2a6a97caa1b16b715dc1)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/hlua.c b/src/hlua.c
index f3c3a5a..0b5eaaf 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -1269,7 +1269,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;
 }
 
@@ -1291,7 +1293,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;
 }
 
@@ -1313,8 +1317,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;
 }
 
@@ -1339,10 +1345,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;
 }