Added some checking that LEX_CSTRING is \0 terminated
- When adding LEX_CSTRING to String, we are now checking that string is \0 terminated (as normally LEX_CSTRING should be usable for printf(). In the cases when one wants to avoid the checking one can use String->append(ptr, length) instead of just String->append(LEX_CSTRING*)
This commit is contained in:
parent
f55dc7f733
commit
486c86dd39
@ -7346,8 +7346,8 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
|
|||||||
{
|
{
|
||||||
String tmp;
|
String tmp;
|
||||||
tmp.append("DROP COLUMN ");
|
tmp.append("DROP COLUMN ");
|
||||||
tmp.append(done_start ? table->vers_end_field()->field_name
|
tmp.append(done_start ? &table->vers_end_field()->field_name
|
||||||
: table->vers_start_field()->field_name);
|
: &table->vers_start_field()->field_name);
|
||||||
my_error(ER_MISSING, MYF(0), table_name, tmp.c_ptr());
|
my_error(ER_MISSING, MYF(0), table_name, tmp.c_ptr());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,8 @@ public:
|
|||||||
bool res;
|
bool res;
|
||||||
if (copy_event_cache_to_string_and_reinit(m_cache, &tmp_str))
|
if (copy_event_cache_to_string_and_reinit(m_cache, &tmp_str))
|
||||||
return 1;
|
return 1;
|
||||||
res= m_ev->output_buf.append(&tmp_str) != 0;
|
/* use 2 argument append as tmp_str is not \0 terminated */
|
||||||
|
res= m_ev->output_buf.append(tmp_str.str, tmp_str.length);
|
||||||
my_free(tmp_str.str);
|
my_free(tmp_str.str);
|
||||||
return res ? res : 0;
|
return res ? res : 0;
|
||||||
}
|
}
|
||||||
@ -11783,16 +11784,16 @@ bool Rows_log_event::print_helper(FILE *file,
|
|||||||
LEX_STRING tmp_str;
|
LEX_STRING tmp_str;
|
||||||
if (copy_event_cache_to_string_and_reinit(head, &tmp_str))
|
if (copy_event_cache_to_string_and_reinit(head, &tmp_str))
|
||||||
return 1;
|
return 1;
|
||||||
output_buf.append(&tmp_str);
|
output_buf.append(tmp_str.str, tmp_str.length); // Not \0 terminated
|
||||||
my_free(tmp_str.str);
|
my_free(tmp_str.str);
|
||||||
if (copy_event_cache_to_string_and_reinit(body, &tmp_str))
|
if (copy_event_cache_to_string_and_reinit(body, &tmp_str))
|
||||||
return 1;
|
return 1;
|
||||||
output_buf.append(&tmp_str);
|
output_buf.append(tmp_str.str, tmp_str.length);
|
||||||
my_free(tmp_str.str);
|
my_free(tmp_str.str);
|
||||||
#ifdef WHEN_FLASHBACK_REVIEW_READY
|
#ifdef WHEN_FLASHBACK_REVIEW_READY
|
||||||
if (copy_event_cache_to_string_and_reinit(sql, &tmp_str))
|
if (copy_event_cache_to_string_and_reinit(sql, &tmp_str))
|
||||||
return 1;
|
return 1;
|
||||||
output_buf.append(&tmp_str);
|
output_buf.append(tmp_str.str, tmp_str.length);
|
||||||
my_free(tmp_str.str);
|
my_free(tmp_str.str);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -2328,7 +2328,7 @@ Sp_handler::show_create_sp(THD *thd, String *buf,
|
|||||||
buf->append(STRING_WITH_LEN(" DETERMINISTIC\n"));
|
buf->append(STRING_WITH_LEN(" DETERMINISTIC\n"));
|
||||||
append_suid(buf, chistics.suid);
|
append_suid(buf, chistics.suid);
|
||||||
append_comment(buf, chistics.comment);
|
append_comment(buf, chistics.comment);
|
||||||
buf->append(&body);
|
buf->append(body.str, body.length); // Not \0 terminated
|
||||||
thd->variables.sql_mode= old_sql_mode;
|
thd->variables.sql_mode= old_sql_mode;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -7217,7 +7217,7 @@ void append_row_to_str(String &str, const uchar *row, TABLE *table)
|
|||||||
{
|
{
|
||||||
Field *field= *field_ptr;
|
Field *field= *field_ptr;
|
||||||
str.append(" ");
|
str.append(" ");
|
||||||
str.append(field->field_name);
|
str.append(&field->field_name);
|
||||||
str.append(":");
|
str.append(":");
|
||||||
field_unpack(&str, field, rec, 0, false);
|
field_unpack(&str, field, rec, 0, false);
|
||||||
}
|
}
|
||||||
|
@ -477,19 +477,18 @@ public:
|
|||||||
bool append(const char *s);
|
bool append(const char *s);
|
||||||
bool append(const LEX_STRING *ls)
|
bool append(const LEX_STRING *ls)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(ls->length < UINT_MAX32);
|
DBUG_ASSERT(ls->length < UINT_MAX32 &&
|
||||||
|
((ls->length == 0 && !ls->str) ||
|
||||||
|
ls->length == strlen(ls->str)));
|
||||||
return append(ls->str, (uint32) ls->length);
|
return append(ls->str, (uint32) ls->length);
|
||||||
}
|
}
|
||||||
bool append(const LEX_CSTRING *ls)
|
bool append(const LEX_CSTRING *ls)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(ls->length < UINT_MAX32);
|
DBUG_ASSERT(ls->length < UINT_MAX32 &&
|
||||||
|
((ls->length == 0 && !ls->str) ||
|
||||||
|
ls->length == strlen(ls->str)));
|
||||||
return append(ls->str, (uint32) ls->length);
|
return append(ls->str, (uint32) ls->length);
|
||||||
}
|
}
|
||||||
bool append(const LEX_CSTRING &ls)
|
|
||||||
{
|
|
||||||
DBUG_ASSERT(ls.length < UINT_MAX32);
|
|
||||||
return append(ls.str, (uint32) ls.length);
|
|
||||||
}
|
|
||||||
bool append(const char *s, size_t size);
|
bool append(const char *s, size_t size);
|
||||||
bool append(const char *s, uint arg_length, CHARSET_INFO *cs);
|
bool append(const char *s, uint arg_length, CHARSET_INFO *cs);
|
||||||
bool append_ulonglong(ulonglong val);
|
bool append_ulonglong(ulonglong val);
|
||||||
@ -582,7 +581,9 @@ public:
|
|||||||
}
|
}
|
||||||
void q_append(const LEX_CSTRING *ls)
|
void q_append(const LEX_CSTRING *ls)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(ls->length < UINT_MAX32);
|
DBUG_ASSERT(ls->length < UINT_MAX32 &&
|
||||||
|
((ls->length == 0 && !ls->str) ||
|
||||||
|
ls->length == strlen(ls->str)));
|
||||||
q_append(ls->str, (uint32) ls->length);
|
q_append(ls->str, (uint32) ls->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -595,9 +596,12 @@ public:
|
|||||||
{
|
{
|
||||||
qs_append(str, (uint32)strlen(str));
|
qs_append(str, (uint32)strlen(str));
|
||||||
}
|
}
|
||||||
void qs_append(const LEX_CSTRING *str)
|
void qs_append(const LEX_CSTRING *ls)
|
||||||
{
|
{
|
||||||
qs_append(str->str, str->length);
|
DBUG_ASSERT(ls->length < UINT_MAX32 &&
|
||||||
|
((ls->length == 0 && !ls->str) ||
|
||||||
|
ls->length == strlen(ls->str)));
|
||||||
|
qs_append(ls->str, ls->length);
|
||||||
}
|
}
|
||||||
void qs_append(const char *str, uint32 len);
|
void qs_append(const char *str, uint32 len);
|
||||||
void qs_append_hex(const char *str, uint32 len);
|
void qs_append_hex(const char *str, uint32 len);
|
||||||
|
@ -693,7 +693,13 @@ static void build_trig_stmt_query(THD *thd, TABLE_LIST *tables,
|
|||||||
|
|
||||||
/* Create statement for storing trigger (without trigger order) */
|
/* Create statement for storing trigger (without trigger order) */
|
||||||
if (lex->trg_chistics.ordering_clause == TRG_ORDER_NONE)
|
if (lex->trg_chistics.ordering_clause == TRG_ORDER_NONE)
|
||||||
trigger_def->append(&stmt_definition);
|
{
|
||||||
|
/*
|
||||||
|
Not that here stmt_definition doesn't end with a \0, which is
|
||||||
|
normally expected from a LEX_CSTRING
|
||||||
|
*/
|
||||||
|
trigger_def->append(stmt_definition.str, stmt_definition.length);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Copy data before FOLLOWS/PRECEDES trigger_name */
|
/* Copy data before FOLLOWS/PRECEDES trigger_name */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user