From 5380719f931a101a6e83efc7a1664e42bd6bf6c3 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 3 Sep 2019 12:31:03 +0900
Subject: [PATCH] Fix memory leak with lower, upper and initcap with
 ICU-provided collations

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 | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
index 206576d4bd3..caea7bc805e 100644
--- a/src/backend/utils/adt/formatting.c
+++ b/src/backend/utils/adt/formatting.c
@@ -1586,6 +1586,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
@@ -1709,6 +1710,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
@@ -1833,6 +1835,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
-- 
GitLab