]> granicus.if.org Git - postgresql/commitdiff
Fix memory leak with lower, upper and initcap with ICU-provided collations
authorMichael Paquier <michael@paquier.xyz>
Tue, 3 Sep 2019 03:31:14 +0000 (12:31 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 3 Sep 2019 03:31:14 +0000 (12:31 +0900)
The leak happens in str_tolower, str_toupper and str_initcap, which are
used in several places including their equivalent SQL-level functions,
and can only be triggered when using an ICU-provided collation when
converting the input string.

b615920 fixed a similar leak.  Backpatch down 10 where ICU collations
have been introduced.

Author: Konstantin Knizhnik
Discussion: https://postgr.es/m/94c0ad0a-cbc2-e4a3-7829-2bdeaf9146db@postgrespro.ru
Backpatch-through: 10

src/backend/utils/adt/formatting.c

index 2bf484cda3178c22393336e94963e557bc0d4ef5..fa5fdb693bda3a427a97befd76bb4cd476ae86a7 100644 (file)
@@ -1561,6 +1561,7 @@ str_tolower(const char *buff, size_t nbytes, Oid collid)
                                                                                &buff_conv, buff_uchar, len_uchar);
                        icu_from_uchar(&result, buff_conv, len_conv);
                        pfree(buff_uchar);
+                       pfree(buff_conv);
                }
                else
 #endif
@@ -1685,6 +1686,7 @@ str_toupper(const char *buff, size_t nbytes, Oid collid)
                                                                                &buff_conv, buff_uchar, len_uchar);
                        icu_from_uchar(&result, buff_conv, len_conv);
                        pfree(buff_uchar);
+                       pfree(buff_conv);
                }
                else
 #endif
@@ -1810,6 +1812,7 @@ str_initcap(const char *buff, size_t nbytes, Oid collid)
                                                                                &buff_conv, buff_uchar, len_uchar);
                        icu_from_uchar(&result, buff_conv, len_conv);
                        pfree(buff_uchar);
+                       pfree(buff_conv);
                }
                else
 #endif