From 5d5b2c9d6c9b0b74529a1efb51f11d2d48b77e62 Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Wed, 30 Nov 2016 09:01:42 +0100 Subject: [PATCH] Binlog file is checked at max scale startup if encryption is enabled Binlog file is checked at max scale startup if encryption is enabled. The check might fail while calculating next pos or verifying event type. A message is reported --- server/modules/routing/binlog/blr.c | 4 +- server/modules/routing/binlog/blr_file.c | 93 ++++++------------------ 2 files changed, 25 insertions(+), 72 deletions(-) diff --git a/server/modules/routing/binlog/blr.c b/server/modules/routing/binlog/blr.c index 3705d5a8c..3d8a3a8aa 100644 --- a/server/modules/routing/binlog/blr.c +++ b/server/modules/routing/binlog/blr.c @@ -843,8 +843,10 @@ createInstance(SERVICE *service, char **options) if (!blr_check_binlog(inst)) { - if (inst->trx_safe) + if (inst->trx_safe || inst->encryption.enabled) { + MXS_ERROR("The replication from master cannot be started" + " due to errors in current binlog file"); /* Don't start replication, just return */ return (ROUTER *)inst; } diff --git a/server/modules/routing/binlog/blr_file.c b/server/modules/routing/binlog/blr_file.c index aafb524a4..3c8b3a1b5 100644 --- a/server/modules/routing/binlog/blr_file.c +++ b/server/modules/routing/binlog/blr_file.c @@ -1505,6 +1505,7 @@ blr_read_events_all_events(ROUTER_INSTANCE *router, int fix, int debug) } else { + char errmsg[BLRM_STRERROR_R_MSG_SIZE + 1] = ""; /* fill replication header struct */ hdr.timestamp = EXTRACT32(hdbuf); hdr.event_type = hdbuf[4]; @@ -1513,34 +1514,12 @@ blr_read_events_all_events(ROUTER_INSTANCE *router, int fix, int debug) hdr.next_pos = EXTRACT32(&hdbuf[13]); hdr.flags = EXTRACT16(&hdbuf[17]); - /* Check event type against MAX_EVENT_TYPE */ - - if (router->mariadb10_compat) - { - if (hdr.event_type > MAX_EVENT_TYPE_MARIADB10) - { - MXS_ERROR("Invalid MariaDB 10 event type 0x%x. " - "Binlog file is %s, position %llu", - hdr.event_type, - router->binlog_name, pos); - - event_error = 1; - } - } - else - { - if (hdr.event_type > MAX_EVENT_TYPE) - { - MXS_ERROR("Invalid event type 0x%x. " - "Binlog file is %s, position %llu", - hdr.event_type, - router->binlog_name, pos); - - event_error = 1; - } - } - - if (event_error) + /* Check event */ + if (!blr_binlog_event_check(router, + pos, + &hdr, + router->binlog_name, + errmsg)) { router->binlog_position = last_known_commit; router->current_safe_event = last_known_commit; @@ -1702,6 +1681,8 @@ blr_read_events_all_events(ROUTER_INSTANCE *router, int fix, int debug) uint32_t event_size = EXTRACT32(hdbuf + BINLOG_EVENT_LEN_OFFSET); uint8_t *decrypt_ptr; unsigned long next_pos; + char errmsg[BLRM_STRERROR_R_MSG_SIZE + 1] = ""; + char *event_desc; /** * Events are encrypted. @@ -1729,59 +1710,29 @@ blr_read_events_all_events(ROUTER_INSTANCE *router, int fix, int debug) hdr.event_type = decrypt_ptr[4]; hdr.serverid = EXTRACT32(&decrypt_ptr[5]); hdr.event_size = extract_field(&decrypt_ptr[9], 32); - hdr.next_pos = pos + event_size; + hdr.next_pos = EXTRACT32(&decrypt_ptr[13]); hdr.flags = EXTRACT16(&decrypt_ptr[17]); /* Get next pos from decrypted event header */ next_pos = EXTRACT32(&decrypt_ptr[13]); + event_desc = blr_get_event_description(router, hdr.event_type); - MXS_DEBUG("Event time %lu\nEvent Type %u (%s)\nServer Id %lu\nNextPos %lu/%lu\nFlags %u", - (unsigned long)hdr.timestamp, hdr.event_type, - blr_get_event_description(router, hdr.event_type), - (unsigned long)hdr.serverid, next_pos, - (unsigned long)hdr.next_pos, hdr.flags); + MXS_DEBUG("%8sEvent time %lu\n%39sEvent Type %u (%s)\n%39sServer Id %lu\n%39sNextPos %lu\n%39sFlags %u", + " ", (unsigned long)hdr.timestamp, " ", hdr.event_type, + event_desc ? event_desc : "NULL", " ", + (unsigned long)hdr.serverid, " ", next_pos, " ", hdr.flags); - /* Sanity checks for event type */ - if (router->mariadb10_compat) + /* Check event */ + if (!blr_binlog_event_check(router, + pos, + &hdr, + router->binlog_name, + errmsg)) { - if (hdr.event_type > MAX_EVENT_TYPE_MARIADB10) - { - MXS_ERROR("Invalid MariaDB 10 event type 0x%x. " - "Binlog file is %s, position %llu", - hdr.event_type, - router->binlog_name, pos); - - event_error = 1; - } - } - else - { - if (hdr.event_type > MAX_EVENT_TYPE) - { - MXS_ERROR("Invalid event type 0x%x. " - "Binlog file is %s, position %llu", - hdr.event_type, - router->binlog_name, pos); - - event_error = 1; - } - } - if (event_error) - { - MXS_ERROR("Event Type is wrong, check encryption settings"); - router->m_errno = BINLOG_FATAL_ERROR_READING; - gwbuf_free(decrypted_event); - gwbuf_free(result); - return 1; - } - - /* Sanity checks for pos */ - if (next_pos != hdr.next_pos) - { - MXS_ERROR("Next pos is wrong, check encryption settings"); router->m_errno = BINLOG_FATAL_ERROR_READING; gwbuf_free(decrypted_event); gwbuf_free(result); + MXS_ERROR("Error while decrypting event: %s", errmsg); return 1; }