Re: Fixes bug in strlower_libc_sb()

Поиск
Список
Период
Сортировка
От Chao Li
Тема Re: Fixes bug in strlower_libc_sb()
Дата
Msg-id CAEoWx2m9mUN397neL=p9x0vaVcj5EGiKD53F1MNTwTDXizxiaA@mail.gmail.com
обсуждение исходный текст
Ответ на Fixes bug in strlower_libc_sb()  (Chao Li <li.evan.chao@gmail.com>)
Список pgsql-hackers

On Tue, Nov 25, 2025 at 11:03 AM Chao Li <li.evan.chao@gmail.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.




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.
Вложения

В списке pgsql-hackers по дате отправления: