From: Christopher Faulet Date: Tue, 14 Nov 2017 15:47:26 +0000 (+0100) Subject: BUG/MEDIUM: standard: itao_str/idx and quote_str/idx must be thread-local X-Git-Tag: v1.8-rc4~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99bca65f539844600ad7e89cd37da0472c6fe3b2;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: standard: itao_str/idx and quote_str/idx must be thread-local 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. --- diff --git a/include/common/standard.h b/include/common/standard.h index d88599de44..9819c9aa3e 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -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 chars from to . 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); diff --git a/src/standard.c b/src/standard.c index 34d4148d49..9be783200b 100644 --- a/src/standard.c +++ b/src/standard.c @@ -46,14 +46,14 @@ * '' 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