DEV: hpack: fix `trash` build regression
Since 7d84439 ("BUILD: hpack: include global.h for the trash that is needed
in debug mode"), hpack decode tool fails to compile on targets that enable
USE_THREAD. (ie: linux-glibc target as reported by Christian Ruppert)
When building hpack devtool, we are including src/hpack-dec.c as a dependency.
src/hpack-dec.c relies on the global trash whe debug mode is enabled.
But as we're building hpack tool with a limited scope of haproxy
sources, global trash (which is declared in src/chunk.c) is not available.
Thus, src/hpack-dec.c relies on a local 'trash' variable declared within
dev/hpack/decode.c
This used to work fine until 7d84439.
But now that global.h is explicitely included in src/hpack-dec.c,
trash variable definition from decode.c conflicts with the one from global.h:
In file included from include/../src/hpack-dec.c:35,
from dev/hpack/decode.c:87:
include/haproxy/global.h:52:35: error: thread-local declaration of 'trash' follows non-thread-local declaration
52 | extern THREAD_LOCAL struct buffer trash;
Adding THREAD_LOCAL attribute to 'decode.c' local trash variable definition
makes the compiler happy again.
This should fix GH issue #2009 and should be backported to 2.7.
(cherry picked from commit 532ebee38e83b0b406e91af88262432012d943f4)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit 29d13c9a7d8b764b04efc18aae04dead19fb7c1c)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit 6a46ea603ccdc16f464dd6364454a1dc44cfcac9)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit 5d6d3c48a157da25259dd6f894a8034d1fc142e0)
Signed-off-by: Willy Tarreau <w@1wt.eu>
diff --git a/dev/hpack/decode.c b/dev/hpack/decode.c
index ae82512..13c95c7 100644
--- a/dev/hpack/decode.c
+++ b/dev/hpack/decode.c
@@ -30,7 +30,7 @@
char trash_buf[MAX_RQ_SIZE];
char tmp_buf[MAX_RQ_SIZE];
-struct buffer trash = { .area = trash_buf, .data = 0, .size = sizeof(trash_buf) };
+THREAD_LOCAL struct buffer trash = { .area = trash_buf, .data = 0, .size = sizeof(trash_buf) };
struct buffer tmp = { .area = tmp_buf, .data = 0, .size = sizeof(tmp_buf) };
/* displays a <len> long memory block at <buf>, assuming first byte of <buf>