Hi Patrick,

Could you retry adding the keyword “local” before data. Unfortunately, by 
default, Lua variables are global.


>     core.register_action("test", { "http-req" }, function(txn)
>         local data = txn:get_priv()
>         if not data then
>             data = 0
>         end
>         data = data + 1
>         print(string.format("set to %d", data))
>         txn:set_priv(data)
>     end)


BR,
Thierry


> On 22 Aug 2018, at 05:57, Patrick Hemmer <[email protected]> wrote:
> 
> There is a bug in the current stable haproxy (1.8.13) where the LUA function 
> txn:get_priv() is returning data stored from other transactions. This was 
> discovered as we have code that triggers on certain requests, and it was 
> triggering on requests it should not have been.
> 
> You can reproduce with this config:
>     global
>         lua-load haproxy.lua
> 
>     defaults
>         mode http
> 
>     frontend f1
>         bind :8000
>         default_backend b1
>         http-request lua.test
> 
>     backend b1
>         http-request use-service lua.fakeserv
> 
> And this lua file:
>     core.register_action("test", { "http-req" }, function(txn)
>         data = txn:get_priv()
>         if not data then
>             data = 0
>         end
>         data = data + 1
>         print(string.format("set to %d", data))
>         txn:set_priv(data)
>     end)
> 
>     core.register_service("fakeserv", "http", function(applet)
>         applet:set_status(200)
>         applet:start_response()
>     end)
> 
> And this curl command:
>     curl http://localhost:8000 <http://localhost:8000/> http://localhost:8000 
> <http://localhost:8000/>
> 
> Which provides this output:
>     set to 1
>     set to 2
> 
> 
> 
> Version information:
>     HA-Proxy version 1.8.13 2018/07/30
>     Copyright 2000-2018 Willy Tarreau <[email protected]> 
> <mailto:[email protected]>
> 
>     Build options :
>         TARGET  = osx
>         CPU     = generic
>         CC      = gcc
>         CFLAGS  = -O0 -g -fno-strict-aliasing -Wdeclaration-after-statement 
> -fwrapv -fno-strict-overflow -Wno-address-of-packed-member 
> -Wno-null-dereference -Wno-unused-label
>         OPTIONS = USE_ZLIB=1 USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1
> 
>     Default settings :
>         maxconn = 2000, bufsize = 16384, maxrewrite = 1024, maxpollevents = 
> 200
> 
>     Built with OpenSSL version : OpenSSL 1.1.0h  27 Mar 2018
>     Running on OpenSSL version : OpenSSL 1.1.0h  27 Mar 2018
>     OpenSSL library supports TLS extensions : yes
>     OpenSSL library supports SNI : yes
>     OpenSSL library supports : TLSv1.0 TLSv1.1 TLSv1.2
>     Built with Lua version : Lua 5.3.4
>     Built with transparent proxy support using:
>     Encrypted password support via crypt(3): yes
>     Built with PCRE version : 8.42 2018-03-20
>     Running on PCRE version : 8.42 2018-03-20
>     PCRE library supports JIT : no (USE_PCRE_JIT not set)
>     Built with zlib version : 1.2.11
>     Running on zlib version : 1.2.11
>     Compression algorithms supported : identity("identity"), 
> deflate("deflate"), raw-deflate("deflate"), gzip("gzip")
>     Built with network namespace support.
> 
>     Available polling systems :
>              kqueue : pref=300,  test result OK
>                  poll : pref=200,  test result OK
>              select : pref=150,  test result OK
>     Total: 3 (3 usable), will use kqueue.
> 
>     Available filters :
>         [SPOE] spoe
>         [COMP] compression
>         [TRACE] trace
> 
> 
> -Patrick

Reply via email to