postgres.git / summary / log / commit / refs
commit 27e2afb492cd553093c92ea917d24651b5a9ae16
Author: Jeff Davis <jdavis@postgresql.org>
Date: Tue Aug 18 00:55:42 2026 +0000
pg_locale.c: Fix REL_18_STABLE for srclen < 0.
Ensure that srclen >= 0 before calling strlower_c(), etc.
Commit 5f003855e7 backported strlower_c(), etc., to 18, but did not
account for the srclen < 0 behavior that existed in 18 (and was
removed later in version 19 with commit 6d22c67c3b).
No callers in core use the srclen < 0 behavior, but it's possible
(though unlikely) that extensions do.
This applies to REL_18_STABLE only.
Discussion: https://postgr.es/m/v36ssaygf7grb3qzfsjhtdzi7kqd45ds56nyuf7gi5qjml4qbb@ezmfqzmhlrs2
src/backend/utils/adt/pg_locale.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 2f8d5fea8f2..9c721efb52f 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -1328,6 +1328,8 @@ size_t
pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen,
pg_locale_t locale)
{
+ srclen = (srclen < 0) ? strlen(src) : srclen;
+
if (locale->ctype_is_c)
return strlower_c(dst, dstsize, src, srclen);
else if (locale->provider == COLLPROVIDER_BUILTIN)
@@ -1349,6 +1351,8 @@ size_t
pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen,
pg_locale_t locale)
{
+ srclen = (srclen < 0) ? strlen(src) : srclen;
+
if (locale->ctype_is_c)
return strtitle_c(dst, dstsize, src, srclen);
else if (locale->provider == COLLPROVIDER_BUILTIN)
@@ -1370,6 +1374,8 @@ size_t
pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen,
pg_locale_t locale)
{
+ srclen = (srclen < 0) ? strlen(src) : srclen;
+
if (locale->ctype_is_c)
return strupper_c(dst, dstsize, src, srclen);
else if (locale->provider == COLLPROVIDER_BUILTIN)
@@ -1391,6 +1397,8 @@ size_t
pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen,
pg_locale_t locale)
{
+ srclen = (srclen < 0) ? strlen(src) : srclen;
+
/* in the C locale, casefolding is the same as lowercasing */
if (locale->ctype_is_c)
return strlower_c(dst, dstsize, src, srclen);
[parent: 171f1249474c]