pg_mblen_range, pg_mblen_with_len: Valgrind after encoding ereport.

The prior order caused spurious Valgrind errors.  They're spurious
because the ereport(ERROR) non-local exit discards the pointer in
question.  pg_mblen_cstr() ordered the checks correctly, but these other
two did not.  Back-patch to v14, like commit
1e7fe06c10.

Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Discussion: https://postgr.es/m/20260214053821.fa.noahmisch@microsoft.com
Backpatch-through: 14
This commit is contained in:
Noah Misch 2026-02-14 12:16:16 -08:00
parent c66f4cff1a
commit 45eb47230d

View file

@ -1085,15 +1085,16 @@ pg_mblen_range(const char *mbstr, const char *end)
int length = pg_wchar_table[DatabaseEncoding->encoding].mblen((const unsigned char *) mbstr);
Assert(end > mbstr);
if (unlikely(mbstr + length > end))
report_invalid_encoding_db(mbstr, length, end - mbstr);
#ifdef VALGRIND_EXPENSIVE
VALGRIND_CHECK_MEM_IS_DEFINED(mbstr, end - mbstr);
#else
VALGRIND_CHECK_MEM_IS_DEFINED(mbstr, length);
#endif
if (unlikely(mbstr + length > end))
report_invalid_encoding_db(mbstr, length, end - mbstr);
return length;
}
@ -1108,15 +1109,16 @@ pg_mblen_with_len(const char *mbstr, int limit)
int length = pg_wchar_table[DatabaseEncoding->encoding].mblen((const unsigned char *) mbstr);
Assert(limit >= 1);
if (unlikely(length > limit))
report_invalid_encoding_db(mbstr, length, limit);
#ifdef VALGRIND_EXPENSIVE
VALGRIND_CHECK_MEM_IS_DEFINED(mbstr, limit);
#else
VALGRIND_CHECK_MEM_IS_DEFINED(mbstr, length);
#endif
if (unlikely(length > limit))
report_invalid_encoding_db(mbstr, length, limit);
return length;
}