mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
5fa9664b07
(MYSQLBINLOG -V CRASHES WITH THAT BINLOG) Problem: If slave receives a corrupted row event, slave server is crashing. Analysis: When slave is unpacking the row event, it is not validating the data before applying the event. If the data is corrupted for eg: the length of a field is wrong, it could end up reading wrong data leading to a crash. A similar problem happens when mysqlbinlog tool is used against a corrupted binlog using '-v' option. Due to -v option, the tool tries to print the values of all the fields. Corrupted field length could lead to a crash. Fix: Before unpacking the field, a verification will be made on the length. If it falls into the event range, only then it will be unpacked. Otherwise, "ER_SLAVE_CORRUPT_EVENT" error will be thrown. Incase mysqlbinlog -v case, the field value will not be printed and the processing of the file will be stopped. sql/field.h: Removed a function which is not required anymore sql/log_event.cc: Adding a validation on the field length before the tool tries to print the value. sql/log_event.h: Changing unpack_row call according to the new arguments sql/log_event_old.h: Changing unpack_row call according to the new arguments sql/rpl_record.cc: Adding a new argument 'row_end' which tells the end position of the complete data in the row event. It will be used to do validation before doing 'unpack' field. sql/rpl_record.h: Adding a new argument 'row_end' which tells the end position of the complete data in the row event. It will be used to do validation before doing 'unpack' field. sql/rpl_utility.cc: Now calc_field_size() is required for client too.
42 lines
1.5 KiB
C++
42 lines
1.5 KiB
C++
/* Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
#ifndef RPL_RECORD_H
|
|
#define RPL_RECORD_H
|
|
|
|
#include <rpl_reporting.h>
|
|
#include "my_global.h" /* uchar */
|
|
|
|
class Relay_log_info;
|
|
struct TABLE;
|
|
typedef struct st_bitmap MY_BITMAP;
|
|
|
|
#if !defined(MYSQL_CLIENT)
|
|
size_t pack_row(TABLE* table, MY_BITMAP const* cols,
|
|
uchar *row_data, const uchar *data);
|
|
#endif
|
|
|
|
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
|
int unpack_row(Relay_log_info const *rli,
|
|
TABLE *table, uint const colcnt,
|
|
uchar const *const row_data, MY_BITMAP const *cols,
|
|
uchar const **const curr_row_end, ulong *const master_reclength,
|
|
uchar const *const row_end);
|
|
|
|
// Fill table's record[0] with default values.
|
|
int prepare_record(TABLE *const table, const uint skip, const bool check);
|
|
#endif
|
|
|
|
#endif
|