• Tom Lane's avatar
    Improve dubious memory management in pg_newlocale_from_collation(). · 7b86c2ac
    Tom Lane authored
    pg_newlocale_from_collation() used malloc() and strdup() directly,
    which is generally not per backend coding style, and it didn't bother
    to check for failure results, but would just SIGSEGV instead.  Also,
    if one of the numerous error checks in the middle of the function
    failed, the already-allocated memory would be leaked permanently.
    Admittedly, it's not a lot of memory, but it could build up if this
    function were called repeatedly for a bad collation.
    
    The first two problems are easily cured by palloc'ing in TopMemoryContext
    instead of calling libc directly.  We can fairly easily dodge the leakage
    problem for the struct pg_locale_struct by filling in a temporary variable
    and allocating permanent storage only once we reach the bottom of the
    function.  It's harder to get rid of the potential leakage for ICU's copy
    of the collcollate string, but at least that's only allocated after most
    of the error checks; so live with that aspect.
    
    Back-patch to v10 where this code came in, with one or another of the
    ICU patches.
    7b86c2ac
pg_locale.c 50.7 KB