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.
This commit is contained in:
Christopher Faulet 2017-11-14 16:47:26 +01:00 committed by Willy Tarreau
parent 919b739862
commit 99bca65f53
2 changed files with 6 additions and 6 deletions

View 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);

View File

@ -46,14 +46,14 @@
* '<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