]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: lua: fix missing lock protection on server.
authorEmeric Brun <ebrun@haproxy.com>
Thu, 2 Nov 2017 16:21:40 +0000 (17:21 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 3 Nov 2017 14:17:59 +0000 (15:17 +0100)
To avoid inconsistencies server's attributes must be read
or updated under lock.

src/hlua_fcn.c

index 60becb02f1489e79200f5483b51f247c7be60ad9..566b0e5c03e35574a4e6e787397b8cddf243f42c 100644 (file)
@@ -587,7 +587,9 @@ int hlua_server_set_weight(lua_State *L)
        srv = hlua_check_server(L, 1);
        weight = luaL_checkstring(L, 2);
 
+       SPIN_LOCK(SERVER_LOCK, &srv->lock);
        err = server_parse_weight_change_request(srv, weight);
+       SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
        if (!err)
                lua_pushnil(L);
        else
@@ -613,7 +615,9 @@ int hlua_server_set_addr(lua_State *L)
        srv = hlua_check_server(L, 1);
        addr = luaL_checkstring(L, 2);
 
+       SPIN_LOCK(SERVER_LOCK, &srv->lock);
        err = server_parse_addr_change_request(srv, addr, "Lua script");
+       SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
        if (!err)
                lua_pushnil(L);
        else
@@ -696,12 +700,12 @@ int hlua_server_check_force_up(lua_State *L)
        struct server *sv;
 
        sv = hlua_check_server(L, 1);
+       SPIN_LOCK(SERVER_LOCK, &sv->lock);
        if (!(sv->track)) {
-               SPIN_LOCK(SERVER_LOCK, &sv->lock);
                sv->check.health = sv->check.rise + sv->check.fall - 1;
                srv_set_running(sv, "changed from Lua script", NULL);
-               SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
        }
+       SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
        return 0;
 }
 
@@ -710,12 +714,12 @@ int hlua_server_check_force_nolb(lua_State *L)
        struct server *sv;
 
        sv = hlua_check_server(L, 1);
+       SPIN_LOCK(SERVER_LOCK, &sv->lock);
        if (!(sv->track)) {
-               SPIN_LOCK(SERVER_LOCK, &sv->lock);
                sv->check.health = sv->check.rise + sv->check.fall - 1;
                srv_set_stopping(sv, "changed from Lua script", NULL);
-               SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
        }
+       SPIN_UNLOCK(SERVER_LOCK, &sv->lock);
        return 0;
 }