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.
|
# 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
|
||||||
|
@@ -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';
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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];
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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) &&
|
||||||
|
Reference in New Issue
Block a user