summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorKristian Nielsen <knielsen@knielsen-hq.org>2014-06-25 13:08:30 +0200
committerKristian Nielsen <knielsen@knielsen-hq.org>2014-06-25 13:08:30 +0200
commit00467e136e5080e8c175019534ad198b7dcc35d3 (patch)
tree3b519789fae2ad61ea09ea65e5c7ba162b07cea7 /sql
parent5591ef0184ae698b94e05cd8c4960effed22405a (diff)
downloadmariadb-git-00467e136e5080e8c175019534ad198b7dcc35d3.tar.gz
MDEV-5799: Error messages written upon LOST EVENTS incident are corrupted
This is MySQL Bug#59123. The message string stored in an INCIDENT event was not zero-terminated. This caused any following checksum bytes (if enabled on the master) to be output to the error log as trailing garbage when the message was printed to the error log. Backport the patch from MySQL 5.6: revno: 2876.228.200 revision-id: zhenxing.he@sun.com-20110111051323-w2xnzvcjn46x6h6u committer: He Zhenxing <zhenxing.he@sun.com> timestamp: Tue 2011-01-11 13:13:23 +0800 message: BUG#59123 rpl_stm_binlog_max_cache_size fails sporadically with found warnings Also add a test case.
Diffstat (limited to 'sql')
-rw-r--r--sql/log.cc3
-rw-r--r--sql/log_event.cc12
-rw-r--r--sql/log_event.h11
3 files changed, 23 insertions, 3 deletions
diff --git a/sql/log.cc b/sql/log.cc
index dafe89ac7f0..4f9a1f2b746 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -2646,7 +2646,8 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
{
if (!fn_ext(log_name)[0])
{
- if (find_uniq_filename(new_name))
+ if (DBUG_EVALUATE_IF("binlog_inject_new_name_error", TRUE, FALSE) ||
+ find_uniq_filename(new_name))
{
my_printf_error(ER_NO_UNIQUE_LOGFILE, ER(ER_NO_UNIQUE_LOGFILE),
MYF(ME_FATALERROR), log_name);
diff --git a/sql/log_event.cc b/sql/log_event.cc
index dd337c92744..373bf2c3548 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -12452,6 +12452,8 @@ Incident_log_event::Incident_log_event(const char *buf, uint event_len,
DBUG_PRINT("info",("event_len: %u; common_header_len: %d; post_header_len: %d",
event_len, common_header_len, post_header_len));
+ m_message.str= NULL;
+ m_message.length= 0;
int incident_number= uint2korr(buf + common_header_len);
if (incident_number >= INCIDENT_COUNT ||
incident_number <= INCIDENT_NONE)
@@ -12468,7 +12470,13 @@ Incident_log_event::Incident_log_event(const char *buf, uint event_len,
uint8 len= 0; // Assignment to keep compiler happy
const char *str= NULL; // Assignment to keep compiler happy
read_str(&ptr, str_end, &str, &len);
- m_message.str= const_cast<char*>(str);
+ if (!(m_message.str= (char*) my_malloc(len+1, MYF(MY_WME))))
+ {
+ /* Mark this event invalid */
+ m_incident= INCIDENT_NONE;
+ DBUG_VOID_RETURN;
+ }
+ strmake(m_message.str, str, len);
m_message.length= len;
DBUG_PRINT("info", ("m_incident: %d", m_incident));
DBUG_VOID_RETURN;
@@ -12477,6 +12485,8 @@ Incident_log_event::Incident_log_event(const char *buf, uint event_len,
Incident_log_event::~Incident_log_event()
{
+ if (m_message.str)
+ my_free(m_message.str);
}
diff --git a/sql/log_event.h b/sql/log_event.h
index 2091d968558..c0370014c7d 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -4686,7 +4686,16 @@ public:
{
DBUG_ENTER("Incident_log_event::Incident_log_event");
DBUG_PRINT("enter", ("m_incident: %d", m_incident));
- m_message= msg;
+ m_message.str= NULL;
+ m_message.length= 0;
+ if (!(m_message.str= (char*) my_malloc(msg.length+1, MYF(MY_WME))))
+ {
+ /* Mark this event invalid */
+ m_incident= INCIDENT_NONE;
+ DBUG_VOID_RETURN;
+ }
+ strmake(m_message.str, msg.str, msg.length);
+ m_message.length= msg.length;
set_direct_logging();
/* Replicate the incident irregardless of @@skip_replication. */
flags&= ~LOG_EVENT_SKIP_REPLICATION_F;