1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-35688 UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset in my_casedn_utf8mb3

The functions MY_CHARSET_HANDLER::caseup() and MY_CHARSET_HANDLER::casedn()
in their virtual imlementations do "const char *end= src + srclen"
in the very beginning. Therefore src cannot be NULL to avoid
"UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset".

Adding DBUG_ASSERT(src != NULL) into all virtual implementations,
to catch this problem in regular Debug builds (without UBSAN).

Fixing Master_info_index::get_master_info() to check connection_name->str.
If it is NULL then passing empty_clex_str into IdentBufferCasedn
instead of *connection_name.
This commit is contained in:
Alexander Barkov
2025-01-20 19:53:25 +04:00
parent 6be42c7276
commit c1559f261f
8 changed files with 31 additions and 1 deletions

View File

@@ -43,3 +43,9 @@ SELECT @@GLOBAL.replicate_do_db;
# Cleanup. # Cleanup.
SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; SET @@GLOBAL.replicate_do_db = @save_replicate_do_db;
#
# MDEV-35688 UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset in my_casedn_utf8mb3
#
show variables like 'replicate_do_db';
Variable_name Value
replicate_do_db

View File

@@ -43,3 +43,9 @@ SELECT @@GLOBAL.replicate_do_db;
--echo # Cleanup. --echo # Cleanup.
SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; SET @@GLOBAL.replicate_do_db = @save_replicate_do_db;
--echo #
--echo # MDEV-35688 UBSAN: SUMMARY: UndefinedBehaviorSanitizer: nullptr-with-offset in my_casedn_utf8mb3
--echo #
show variables like 'replicate_do_db';

View File

@@ -1374,7 +1374,9 @@ Master_info_index::get_master_info(const LEX_CSTRING *connection_name,
connection_name->str)); connection_name->str));
/* Make name lower case for comparison */ /* Make name lower case for comparison */
IdentBufferCasedn<MAX_CONNECTION_NAME> buff(*connection_name); IdentBufferCasedn<MAX_CONNECTION_NAME> buff(connection_name->str ?
*connection_name :
empty_clex_str);
mi= (Master_info*) my_hash_search(&master_info_hash, mi= (Master_info*) my_hash_search(&master_info_hash,
(const uchar*) buff.ptr(), buff.length()); (const uchar*) buff.ptr(), buff.length());
if (!mi && warning != Sql_condition::WARN_LEVEL_NOTE) if (!mi && warning != Sql_condition::WARN_LEVEL_NOTE)

View File

@@ -125,6 +125,7 @@ size_t
my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen, my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
char *dst, size_t dstlen) char *dst, size_t dstlen)
{ {
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs)); DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs));
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_lower, 0); return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_lower, 0);
@@ -135,6 +136,7 @@ size_t
my_caseup_mb(CHARSET_INFO * cs, const char *src, size_t srclen, my_caseup_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
char *dst, size_t dstlen) char *dst, size_t dstlen)
{ {
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs)); DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs));
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1); return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1);

View File

@@ -253,6 +253,7 @@ size_t my_caseup_8bit(CHARSET_INFO * cs, const char *src, size_t srclen,
{ {
const char *end= src + srclen; const char *end= src + srclen;
register const uchar *map= cs->to_upper; register const uchar *map= cs->to_upper;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
for ( ; src != end ; src++) for ( ; src != end ; src++)
*dst++= (char) map[(uchar) *src]; *dst++= (char) map[(uchar) *src];
@@ -265,6 +266,7 @@ size_t my_casedn_8bit(CHARSET_INFO * cs, const char *src, size_t srclen,
{ {
const char *end= src + srclen; const char *end= src + srclen;
register const uchar *map=cs->to_lower; register const uchar *map=cs->to_lower;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
for ( ; src != end ; src++) for ( ; src != end ; src++)
*dst++= (char) map[(uchar) *src]; *dst++= (char) map[(uchar) *src];

View File

@@ -1310,6 +1310,7 @@ my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
while ((src < srcend) && while ((src < srcend) &&
@@ -1368,6 +1369,7 @@ my_casedn_utf16(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
while ((src < srcend) && while ((src < srcend) &&
@@ -2180,6 +2182,7 @@ my_caseup_utf32(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
while ((src < srcend) && while ((src < srcend) &&
@@ -2237,6 +2240,7 @@ my_casedn_utf32(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) while ((res= my_utf32_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0)
@@ -3048,6 +3052,7 @@ static size_t my_caseup_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
while ((src < srcend) && while ((src < srcend) &&
@@ -3100,6 +3105,7 @@ static size_t my_casedn_ucs2(CHARSET_INFO *cs, const char *src, size_t srclen,
char *dstend= dst + dstlen; char *dstend= dst + dstlen;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(srclen <= dstlen); DBUG_ASSERT(srclen <= dstlen);
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
while ((src < srcend) && while ((src < srcend) &&
(res= my_ucs2_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0) (res= my_ucs2_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0)

View File

@@ -67219,6 +67219,7 @@ size_t
my_casedn_ujis(CHARSET_INFO * cs, const char *src, size_t srclen, my_casedn_ujis(CHARSET_INFO * cs, const char *src, size_t srclen,
char *dst, size_t dstlen) char *dst, size_t dstlen)
{ {
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs)); DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs));
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_lower, 0); return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_lower, 0);
@@ -67232,6 +67233,7 @@ size_t
my_caseup_ujis(CHARSET_INFO * cs, const char *src, size_t srclen, my_caseup_ujis(CHARSET_INFO * cs, const char *src, size_t srclen,
char *dst, size_t dstlen) char *dst, size_t dstlen)
{ {
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs)); DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs));
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_upper, 1); return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_upper, 1);

View File

@@ -676,6 +676,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen, *dst0= dst; char *dstend= dst + dstlen, *dst0= dst;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
while ((src < srcend) && while ((src < srcend) &&
@@ -754,6 +755,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen, *dst0= dst; char *dstend= dst + dstlen, *dst0= dst;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
while ((src < srcend) && while ((src < srcend) &&
@@ -3124,6 +3126,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen, *dst0= dst; char *dstend= dst + dstlen, *dst0= dst;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
while ((src < srcend) && while ((src < srcend) &&
@@ -3218,6 +3221,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs,
const char *srcend= src + srclen; const char *srcend= src + srclen;
char *dstend= dst + dstlen, *dst0= dst; char *dstend= dst + dstlen, *dst0= dst;
MY_CASEFOLD_INFO *uni_plane= cs->casefold; MY_CASEFOLD_INFO *uni_plane= cs->casefold;
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1); DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
while ((src < srcend) && while ((src < srcend) &&