• Noah Misch's avatar
    Fix failure to copy setlocale() return value. · f0a264a3
    Noah Misch authored
    POSIX permits setlocale() calls to invalidate any previous setlocale()
    return values, but commit 5f538ad0
    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.
    f0a264a3
pg_locale.c 37.7 KB