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:
@@ -43,3 +43,9 @@ SELECT @@GLOBAL.replicate_do_db;
|
||||
|
||||
# Cleanup.
|
||||
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
|
||||
|
@@ -43,3 +43,9 @@ SELECT @@GLOBAL.replicate_do_db;
|
||||
|
||||
--echo # Cleanup.
|
||||
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';
|
||||
|
@@ -1374,7 +1374,9 @@ Master_info_index::get_master_info(const LEX_CSTRING *connection_name,
|
||||
connection_name->str));
|
||||
|
||||
/* 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,
|
||||
(const uchar*) buff.ptr(), buff.length());
|
||||
if (!mi && warning != Sql_condition::WARN_LEVEL_NOTE)
|
||||
|
@@ -125,6 +125,7 @@ size_t
|
||||
my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
|
||||
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(src != dst || cs->cset->casedn_multiply(cs) == 1);
|
||||
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,
|
||||
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(src != dst || cs->cset->caseup_multiply(cs) == 1);
|
||||
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1);
|
||||
|
@@ -253,6 +253,7 @@ size_t my_caseup_8bit(CHARSET_INFO * cs, const char *src, size_t srclen,
|
||||
{
|
||||
const char *end= src + srclen;
|
||||
register const uchar *map= cs->to_upper;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
for ( ; src != end ; 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;
|
||||
register const uchar *map=cs->to_lower;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
for ( ; src != end ; src++)
|
||||
*dst++= (char) map[(uchar) *src];
|
||||
|
@@ -1310,6 +1310,7 @@ my_caseup_utf16(CHARSET_INFO *cs, const char *src, size_t srclen,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -1368,6 +1369,7 @@ my_casedn_utf16(CHARSET_INFO *cs, const char *src, size_t srclen,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -2180,6 +2182,7 @@ my_caseup_utf32(CHARSET_INFO *cs, const char *src, size_t srclen,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -2237,6 +2240,7 @@ my_casedn_utf32(CHARSET_INFO *cs, const char *src, size_t srclen,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
|
||||
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;
|
||||
char *dstend= dst + dstlen;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
|
||||
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;
|
||||
MY_CASEFOLD_INFO *uni_plane= cs->casefold;
|
||||
DBUG_ASSERT(srclen <= dstlen);
|
||||
DBUG_ASSERT(src != NULL); /* Avoid UBSAN nullptr-with-offset */
|
||||
|
||||
while ((src < srcend) &&
|
||||
(res= my_ucs2_uni(cs, &wc, (uchar*) src, (uchar*) srcend)) > 0)
|
||||
|
@@ -67219,6 +67219,7 @@ size_t
|
||||
my_casedn_ujis(CHARSET_INFO * cs, const char *src, size_t srclen,
|
||||
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(src != dst || cs->cset->casedn_multiply(cs) == 1);
|
||||
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,
|
||||
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(src != dst || cs->cset->caseup_multiply(cs) == 1);
|
||||
return my_casefold_ujis(cs, src, srclen, dst, dstlen, cs->to_upper, 1);
|
||||
|
@@ -676,6 +676,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen, *dst0= dst;
|
||||
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);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -754,6 +755,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen, *dst0= dst;
|
||||
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);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -3124,6 +3126,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen, *dst0= dst;
|
||||
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);
|
||||
|
||||
while ((src < srcend) &&
|
||||
@@ -3218,6 +3221,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs,
|
||||
const char *srcend= src + srclen;
|
||||
char *dstend= dst + dstlen, *dst0= dst;
|
||||
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);
|
||||
|
||||
while ((src < srcend) &&
|
||||
|
Reference in New Issue
Block a user