From 8eb4a9312c95be56cdb31f5411eddc2cb2ba89be Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Jan 2019 12:07:02 -0500 Subject: Avoid thread-safety problem in ecpglib. ecpglib attempts to force the LC_NUMERIC locale to "C" while reading server output, to avoid problems with strtod() and related functions. Historically it's just issued setlocale() calls to do that, but that has major problems if we're in a threaded application. setlocale() itself is not required by POSIX to be thread-safe (and indeed is not, on recent OpenBSD). Moreover, its effects are process-wide, so that we could cause unexpected results in other threads, or another thread could change our setting. On platforms having uselocale(), which is required by POSIX:2008, we can avoid these problems by using uselocale() instead. Windows goes its own way as usual, but we can make it safe by using _configthreadlocale(). Platforms having neither continue to use the old code, but that should be pretty much nobody among current systems. This should get back-patched, but let's see what the buildfarm thinks of it first. Michael Meskes and Tom Lane; thanks also to Takayuki Tsunakawa. Discussion: https://postgr.es/m/31420.1547783697@sss.pgh.pa.us --- src/interfaces/ecpg/ecpglib/ecpglib_extern.h | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/interfaces/ecpg/ecpglib/ecpglib_extern.h') diff --git a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h index 1c9bce1456d..41851d59007 100644 --- a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h +++ b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h @@ -12,6 +12,9 @@ #ifndef CHAR_BIT #include #endif +#ifdef LOCALE_T_IN_XLOCALE +#include +#endif enum COMPAT_MODE { @@ -61,7 +64,15 @@ struct statement bool questionmarks; struct variable *inlist; struct variable *outlist; +#ifdef HAVE_USELOCALE + locale_t clocale; + locale_t oldlocale; +#else char *oldlocale; +#ifdef WIN32 + int oldthreadlocale; +#endif +#endif int nparams; char **paramvalues; PGresult *results; -- cgit v1.2.3