From 4d59a316a147d68ff0113cec6b969037d2ee169e Mon Sep 17 00:00:00 2001
From: Jeff Davis <jeff@j-davis.com>
Date: Fri, 19 Jun 2026 14:09:31 -0700
Subject: [PATCH v3 1/4] unicode_case.c: ensure valid UTF8.

Should be valid, but check before calling unicode_strlower(), etc.

Discussion: https://postgr.es/m/c355354e6c3f4a7aafb047361b73db247260fca0.camel@j-davis.com
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Backpatch-through: 17
---
 src/backend/utils/adt/pg_locale_builtin.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/utils/adt/pg_locale_builtin.c b/src/backend/utils/adt/pg_locale_builtin.c
index 01d4f55b07e..7f167e751ea 100644
--- a/src/backend/utils/adt/pg_locale_builtin.c
+++ b/src/backend/utils/adt/pg_locale_builtin.c
@@ -86,6 +86,7 @@ static size_t
 strlower_builtin(char *dest, size_t destsize, const char *src, size_t srclen,
 				 pg_locale_t locale)
 {
+	pg_verifymbstr(src, srclen, false);
 	return unicode_strlower(dest, destsize, src, srclen,
 							locale->builtin.casemap_full);
 }
@@ -103,6 +104,7 @@ strtitle_builtin(char *dest, size_t destsize, const char *src, size_t srclen,
 		.prev_alnum = false,
 	};
 
+	pg_verifymbstr(src, srclen, false);
 	return unicode_strtitle(dest, destsize, src, srclen,
 							locale->builtin.casemap_full,
 							initcap_wbnext, &wbstate);
@@ -112,6 +114,7 @@ static size_t
 strupper_builtin(char *dest, size_t destsize, const char *src, size_t srclen,
 				 pg_locale_t locale)
 {
+	pg_verifymbstr(src, srclen, false);
 	return unicode_strupper(dest, destsize, src, srclen,
 							locale->builtin.casemap_full);
 }
@@ -120,6 +123,7 @@ static size_t
 strfold_builtin(char *dest, size_t destsize, const char *src, size_t srclen,
 				pg_locale_t locale)
 {
+	pg_verifymbstr(src, srclen, false);
 	return unicode_strfold(dest, destsize, src, srclen,
 						   locale->builtin.casemap_full);
 }
-- 
2.43.0

