summaryrefslogtreecommitdiff
path: root/sql/sql_repl.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-09-22 21:29:30 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-09-22 21:29:30 +0300
commit61df98f9642c1616f872d61808ce6d010fe35b44 (patch)
tree6c1eb0014bbbd33dbed8b4a5121909a286b0bfeb /sql/sql_repl.cc
parent55e48b77226fec7619986fc1206930bcf63439fe (diff)
parentd9d9c30b707d7634503c8d3bce7dab7f7ec3fd34 (diff)
downloadmariadb-git-61df98f9642c1616f872d61808ce6d010fe35b44.tar.gz
Merge 10.3 into 10.4
Diffstat (limited to 'sql/sql_repl.cc')
-rw-r--r--sql/sql_repl.cc57
1 files changed, 52 insertions, 5 deletions
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index d1c122ba7a5..5203e0f52a5 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -3982,6 +3982,7 @@ bool mysql_show_binlog_events(THD* thd)
{
Protocol *protocol= thd->protocol;
List<Item> field_list;
+ char errmsg_buf[MYSYS_ERRMSG_SIZE];
const char *errmsg = 0;
bool ret = TRUE;
/*
@@ -3996,6 +3997,9 @@ bool mysql_show_binlog_events(THD* thd)
Master_info *mi= 0;
LOG_INFO linfo;
LEX_MASTER_INFO *lex_mi= &thd->lex->mi;
+ enum enum_binlog_checksum_alg checksum_alg;
+ my_off_t binlog_size;
+ MY_STAT s;
DBUG_ENTER("mysql_show_binlog_events");
@@ -4044,10 +4048,6 @@ bool mysql_show_binlog_events(THD* thd)
mi= 0;
}
- /* Validate user given position using checksum */
- if (lex_mi->pos == pos && !opt_master_verify_checksum)
- verify_checksum_once= true;
-
unit->set_limit(thd->lex->current_select);
limit_start= unit->offset_limit_cnt;
limit_end= unit->select_limit_cnt;
@@ -4071,6 +4071,17 @@ bool mysql_show_binlog_events(THD* thd)
if ((file=open_binlog(&log, linfo.log_file_name, &errmsg)) < 0)
goto err;
+ my_stat(linfo.log_file_name, &s, MYF(0));
+ binlog_size= s.st_size;
+ if (lex_mi->pos > binlog_size)
+ {
+ sprintf(errmsg_buf, "Invalid pos specified. Requested from pos:%llu is "
+ "greater than actual file size:%lu\n", lex_mi->pos,
+ (ulong)s.st_size);
+ errmsg= errmsg_buf;
+ goto err;
+ }
+
/*
to account binlog event header size
*/
@@ -4122,7 +4133,43 @@ bool mysql_show_binlog_events(THD* thd)
}
}
- my_b_seek(&log, pos);
+ if (lex_mi->pos > BIN_LOG_HEADER_SIZE)
+ {
+ checksum_alg= description_event->checksum_alg;
+ /* Validate user given position using checksum */
+ if (checksum_alg != BINLOG_CHECKSUM_ALG_OFF &&
+ checksum_alg != BINLOG_CHECKSUM_ALG_UNDEF)
+ {
+ if (!opt_master_verify_checksum)
+ verify_checksum_once= true;
+ my_b_seek(&log, pos);
+ }
+ else
+ {
+ my_off_t cur_pos= my_b_tell(&log);
+ ulong next_event_len= 0;
+ uchar buff[IO_SIZE];
+ while (cur_pos < pos)
+ {
+ my_b_seek(&log, cur_pos + EVENT_LEN_OFFSET);
+ if (my_b_read(&log, (uchar *)buff, sizeof(next_event_len)))
+ {
+ mysql_mutex_unlock(log_lock);
+ errmsg = "Could not read event_length";
+ goto err;
+ }
+ next_event_len= uint4korr(buff);
+ cur_pos= cur_pos + next_event_len;
+ }
+ if (cur_pos > pos)
+ {
+ mysql_mutex_unlock(log_lock);
+ errmsg= "Invalid input pos specified please provide valid one.";
+ goto err;
+ }
+ my_b_seek(&log, cur_pos);
+ }
+ }
for (event_count = 0;
(ev = Log_event::read_log_event(&log,