1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00

ltree/crc32.c: fix fragile code.

Explicitly make space for the NUL when casefolding.

No known bug in the previous code, because the previous buffer (size
12) was more than large enough for folding any codepoint with enough
room left for a NUL. The builtin provider's limit is 7; ICU's limit
seems to be 7 also; and libc always does 1:1 mappings so the real
limit is MAX_MULTIBYTE_CHAR_LEN + 1 (size 5).

Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Reviewed-by: Rithvika Devisetti <devisettirithvika@gmail.com>
Discussion: https://postgr.es/m/2cfbc37ae8deccd3825e36b7f31c391cbf8ff9b8.camel@j-davis.com
Backpatch-through: 18
This commit is contained in:
Jeff Davis
2026-08-24 13:33:31 -07:00
parent 364fc8e72e
commit 8fa803dd69

View File

@@ -46,13 +46,14 @@ ltree_crc32_sz(const char *buf, int size)
{
while (size > 0)
{
char foldstr[UNICODE_CASEMAP_BUFSZ];
/* max space required to map single codepoint, including NUL */
char foldstr[UNICODE_CASEMAP_BUFSZ + 1];
int srclen = pg_mblen_range(p, end);
size_t foldlen;
/* fold one codepoint at a time */
foldlen = pg_strfold(foldstr, UNICODE_CASEMAP_BUFSZ, p, srclen,
locale);
foldlen = pg_strfold(foldstr, sizeof(foldstr), p, srclen, locale);
Assert(foldlen < sizeof(foldstr));
COMP_TRADITIONAL_CRC32(crc, foldstr, foldlen);