mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fixed bug lp:917689 "Archive table corruption crashing MariaDB signal 11"
Added 'from_end' as extra parameter to Field::unpack() to detect wrong from data. Change ha_archive::unpack_row() to detect wrong field lengths. Replication code changed to detect wrong field information in events. mysql-test/r/archive.result: dded test case for lp:917689 sql/field.cc: Added 'from_end' as extra parameter to Field::unpack() to detect wrong from data. Removed not used 'unpack_key' functions. sql/field.h: Added 'from_end' as extra parameter to Field::unpack() to detect wrong from data. Removed not used 'unpack_key' functions. Removed some not needed unpack() functions. sql/filesort.cc: Added buffer end parameter to unpack_addon_fields() sql/log_event.h: Added end of buffer argument to unpack_row() sql/log_event_old.cc: Added end of buffer argument to unpack_row() sql/log_event_old.h: Added end of buffer argument to unpack_row() sql/records.cc: Added buffer end parameter to unpack_addon_fields() sql/rpl_record.cc: Added end of buffer argument to unpack_row() Added detection of wrong field information in events sql/rpl_record.h: Added end of buffer argument to unpack_row() sql/rpl_record_old.cc: Added end of buffer argument to unpack_row() Added detection of wrong field information in events sql/rpl_record_old.h: Added end of buffer argument to unpack_row() sql/table.h: Added buffer end parameter to unpack() storage/archive/ha_archive.cc: Change ha_archive::unpack_row() to detect wrong field lengths. This fixes lp:917689
This commit is contained in:
@ -82,12 +82,15 @@ pack_row_old(TABLE *table, MY_BITMAP const* cols,
|
||||
ER_NO_DEFAULT_FOR_FIELD
|
||||
Returned if one of the fields existing on the slave but not on
|
||||
the master does not have a default value (and isn't nullable)
|
||||
ER_SLAVE_CORRUPT_EVENT
|
||||
Wrong data for field found.
|
||||
*/
|
||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||
int
|
||||
unpack_row_old(Relay_log_info *rli,
|
||||
TABLE *table, uint const colcnt, uchar *record,
|
||||
uchar const *row, MY_BITMAP const *cols,
|
||||
uchar const *row, const uchar *row_buffer_end,
|
||||
MY_BITMAP const *cols,
|
||||
uchar const **row_end, ulong *master_reclength,
|
||||
MY_BITMAP* const rw_set, Log_event_type const event_type)
|
||||
{
|
||||
@ -133,10 +136,16 @@ unpack_row_old(Relay_log_info *rli,
|
||||
if (bitmap_is_set(cols, field_ptr - begin_ptr))
|
||||
{
|
||||
f->move_field_offset(offset);
|
||||
ptr= f->unpack(f->ptr, ptr);
|
||||
ptr= f->unpack(f->ptr, ptr, row_buffer_end, 0);
|
||||
f->move_field_offset(-offset);
|
||||
/* Field...::unpack() cannot return 0 */
|
||||
DBUG_ASSERT(ptr != NULL);
|
||||
if (!ptr)
|
||||
{
|
||||
rli->report(ERROR_LEVEL, ER_SLAVE_CORRUPT_EVENT,
|
||||
"Could not read field `%s` of table `%s`.`%s`",
|
||||
f->field_name, table->s->db.str,
|
||||
table->s->table_name.str);
|
||||
return(ER_SLAVE_CORRUPT_EVENT);
|
||||
}
|
||||
}
|
||||
else
|
||||
bitmap_clear_bit(rw_set, field_ptr - begin_ptr);
|
||||
|
Reference in New Issue
Block a user