On Tue, Nov 25, 2025 at 11:03 AM Chao Li <[email protected]> wrote:
> Hi Hackers,
>
> While reviewing Jeff's patch [1], I found this bug in strlower_libc_sb():
>
> ```
> static size_t
> strlower_libc_sb(char *dest, size_t destsize, const char *src, ssize_t
> srclen,
> pg_locale_t locale)
> {
> if (srclen < 0)
> srclen = strlen(src);
>
> if (srclen + 1 <= destsize)
> {
> locale_t loc = locale->lt;
> char *p;
>
> if (srclen + 1 > destsize) <== This check will never be true
> return srclen;
> ```
>
> So I removed the useless check in the patch.
>
> I also noticed strlower_libc_sb’s behavior is different
> from unicode_strlower(), where the function comment says:
>
> ```
> * Result string is stored in dst, truncating if larger than dstsize. If
> * dstsize is greater than the result length, dst will be NUL-terminated;
> * otherwise not.
> ```
>
> And Jeff’s new code in [1] matches the description. The behavior is like
> trying the best to copy as many chars as possible, if not enough space in
> dest, then NULL-terminator can be omitted. But the current behavior
> of strlower_libc_sb that only copies data to dest when dest has enough
> space for src and NULL-terminator.
>
> So I updated strlower_libc_sb(), strtitle_libc_sb() and strupper_libc_sb()
> to comply with the behavior in this patch as well. “Make check” passed from
> my side, so the patch doesn't seem to break anything.
>
> [1]
> https://www.postgresql.org/message-id/450ceb6260cad30d7afdf155d991a9caafee7c0d.camel%40j-davis.com
>
>
I thought over and splitted the patch into two commits:
0001 - Fixes the obvious bug by simply deleting the useless length check.
0002 - Updates strlower_lic_sb, strtitle_lic_sb, strupper_lic_sb to comply
with unicode_strlower's truncation behavior
Best regards,
Chao Li (Evan)
---------------------
HighGo Software Co., Ltd.
https://www.highgo.com/
v2-0002-Make-libc-based-case-folding-functions-match-unic.patch
Description: Binary data
v2-0001-Fixes-a-bug-in-strlower_libc_sb.patch
Description: Binary data
