]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: standard: itao_str/idx and quote_str/idx must be thread-local
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 14 Nov 2017 15:47:26 +0000 (16:47 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 14 Nov 2017 17:11:57 +0000 (18:11 +0100)
This bug has an impact on the stats applet and easily leads to a crash of HAProxy.

This is specific to threads, no backport is needed.

include/common/standard.h
src/standard.c

index d88599de44cc10cbf340acaadbfa4a9864b21785..9819c9aa3e4cc75243248bdc6c8b0cf9f422fb2c 100644 (file)
@@ -92,7 +92,7 @@ struct split_url {
        int host_len;
 };
 
-extern int itoa_idx; /* index of next itoa_str to use */
+extern THREAD_LOCAL int itoa_idx; /* index of next itoa_str to use */
 
 /*
  * copies at most <size-1> chars from <src> to <dst>. Last char is always
@@ -107,7 +107,7 @@ extern int strlcpy2(char *dst, const char *src, int size);
  * This function simply returns a locally allocated string containing
  * the ascii representation for number 'n' in decimal.
  */
-extern char itoa_str[][171];
+extern THREAD_LOCAL char itoa_str[][171];
 extern char *ultoa_r(unsigned long n, char *buffer, int size);
 extern char *lltoa_r(long long int n, char *buffer, int size);
 extern char *sltoa_r(long n, char *buffer, int size);
index 34d4148d492b9d12a47fe52677ad9abffc45b882..9be783200b67c00ff2b0b465af940b0c55471064 100644 (file)
  * '<span class="rls"></span>' around digits at positions 3N+1 in order
  * to add spacing at up to 6 positions : 18 446 744 073 709 551 615
  */
-char itoa_str[NB_ITOA_STR][171];
-int itoa_idx = 0; /* index of next itoa_str to use */
+THREAD_LOCAL char itoa_str[NB_ITOA_STR][171];
+THREAD_LOCAL int itoa_idx = 0; /* index of next itoa_str to use */
 
 /* sometimes we'll need to quote strings (eg: in stats), and we don't expect
  * to quote strings larger than a max configuration line.
  */
-char quoted_str[NB_QSTR][QSTR_SIZE + 1];
-int quoted_idx = 0;
+THREAD_LOCAL char quoted_str[NB_QSTR][QSTR_SIZE + 1];
+THREAD_LOCAL int quoted_idx = 0;
 
 /*
  * unsigned long long ASCII representation