]> granicus.if.org Git - postgresql/commit
Fix failure to copy setlocale() return value.
authorNoah Misch <noah@leadboat.com>
Sat, 20 Jun 2015 16:09:29 +0000 (12:09 -0400)
committerNoah Misch <noah@leadboat.com>
Sat, 20 Jun 2015 16:09:29 +0000 (12:09 -0400)
commitf0a264a362343287051c4737b01aa3ebe36f21a6
tree97a2900dd74efdab4439d0091b05c4c39250a218
parent1f2a378de41bf3e516b8d2c4d65790aeefbfb89d
Fix failure to copy setlocale() return value.

POSIX permits setlocale() calls to invalidate any previous setlocale()
return values, but commit 5f538ad004aa00cf0881f179f0cde789aad4f47e
neglected to account for setlocale(LC_CTYPE, NULL) doing so.  The effect
was to set the LC_CTYPE environment variable to an unintended value.
pg_perm_setlocale() sets this variable to assist PL/Perl; without it,
Perl would undo PostgreSQL's locale settings.  The known-affected
configurations are 32-bit, release builds using Visual Studio 2012 or
Visual Studio 2013.  Visual Studio 2010 is unaffected, as were all
buildfarm-attested configurations.  In principle, this bug could leave
the wrong LC_CTYPE in effect after PL/Perl use, which could in turn
facilitate problems like corrupt tsvector datums.  No known platform
experiences that consequence, because PL/Perl on Windows does not use
this environment variable.

The bug has been user-visible, as early postmaster failure, on systems
with Windows ANSI code page set to CP936 for "Chinese (Simplified, PRC)"
and probably on systems using other multibyte code pages.
(SetEnvironmentVariable() rejects values containing character data not
valid under the Windows ANSI code page.)  Back-patch to 9.4, where the
faulty commit first appeared.

Reported by Didi Hu and 林鹏程.  Reviewed by Tom Lane, though this fix
strategy was not his first choice.
src/backend/utils/adt/pg_locale.c