Re: Fixes bug in strlower_libc_sb()

From: Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>
To: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Cc: Jeff Davis <pgsql(at)j-davis(dot)com>
Subject: Re: Fixes bug in strlower_libc_sb()
Date: 2025-11-25 05:50:42
Message-ID: CAEoWx2m9mUN397neL=p9x0vaVcj5EGiKD53F1MNTwTDXizxiaA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Nov 25, 2025 at 11:03 AM Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com> 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/

Attachment Content-Type Size
v2-0002-Make-libc-based-case-folding-functions-match-unic.patch application/octet-stream 7.3 KB
v2-0001-Fixes-a-bug-in-strlower_libc_sb.patch application/octet-stream 958 bytes

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Eisentraut 2025-11-25 05:52:42 Re: headerscheck ccache support
Previous Message Peter Eisentraut 2025-11-25 05:46:53 Re: more C99 cleanup