summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorVlad Lesin <vlad_lesin@mail.ru>2022-05-06 10:49:35 +0300
committerVlad Lesin <vlad_lesin@mail.ru>2022-05-11 17:20:31 +0300
commit3fabdc3ca889db0e490df3a9a48ae527f21eed45 (patch)
treeff9dbeb32ba7d037b1908cfd0a638ef4aa4bc823 /extra
parent09ee95e33ef41a9b7c47eefd0abde5b1a246a93f (diff)
downloadmariadb-git-3fabdc3ca889db0e490df3a9a48ae527f21eed45.tar.gz
MDEV-28473 field_ref_zero is not initialized in xtrabackup_prepare_func()
The solution is to initialize field_ref_zero in main_low() before xtrabackup_backup_func() and xtrabackup_prepare_func() calls.
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/xtrabackup.cc41
1 files changed, 21 insertions, 20 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 2b2adf0643c..13319f44969 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -51,6 +51,7 @@ Street, Fifth Floor, Boston, MA 02110-1335 USA
#include <my_getopt.h>
#include <mysql_com.h>
#include <my_default.h>
+#include <scope.h>
#include <sql_class.h>
#include <fcntl.h>
@@ -4511,13 +4512,6 @@ fail:
}
- if (auto b = aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) {
- field_ref_zero = static_cast<byte*>(
- memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX));
- } else {
- goto fail;
- }
-
{
/* definition from recv_recovery_from_checkpoint_start() */
ulint max_cp_field;
@@ -4534,10 +4528,6 @@ reread_log_header:
msg("Error: cannot read redo log header");
unlock_and_fail:
mysql_mutex_unlock(&log_sys.mutex);
-free_and_fail:
- aligned_free(const_cast<byte*>(field_ref_zero));
- field_ref_zero = nullptr;
- goto fail;
}
if (log_sys.log.format == 0) {
@@ -4563,7 +4553,7 @@ free_and_fail:
xtrabackup_init_datasinks();
if (!select_history()) {
- goto free_and_fail;
+ goto fail;
}
/* open the log file */
@@ -4572,7 +4562,7 @@ free_and_fail:
if (dst_log_file == NULL) {
msg("Error: failed to open the target stream for '%s'.",
LOG_FILE_NAME);
- goto free_and_fail;
+ goto fail;
}
/* label it */
@@ -4610,7 +4600,7 @@ free_and_fail:
if (ds_write(dst_log_file, log_hdr_buf, LOG_FILE_HDR_SIZE)) {
msg("error: write to logfile failed");
aligned_free(log_hdr_buf);
- goto free_and_fail;
+ goto fail;
}
aligned_free(log_hdr_buf);
@@ -4631,7 +4621,7 @@ free_and_fail:
" error %s.", ut_strerr(err));
fail_before_log_copying_thread_start:
log_copying_running = false;
- goto free_and_fail;
+ goto fail;
}
/* copy log file by current position */
@@ -4648,7 +4638,7 @@ fail_before_log_copying_thread_start:
/* FLUSH CHANGED_PAGE_BITMAPS call */
if (!flush_changed_page_bitmaps()) {
- goto free_and_fail;
+ goto fail;
}
ut_a(xtrabackup_parallel > 0);
@@ -4670,7 +4660,7 @@ fail_before_log_copying_thread_start:
datafiles_iter_t *it = datafiles_iter_new();
if (it == NULL) {
msg("mariabackup: Error: datafiles_iter_new() failed.");
- goto free_and_fail;
+ goto fail;
}
/* Create data copying threads */
@@ -4725,9 +4715,6 @@ fail_before_log_copying_thread_start:
if (opt_log_innodb_page_corruption)
ok = corrupted_pages.print_to_file(MB_CORRUPTED_PAGES_FILE);
- aligned_free(const_cast<byte*>(field_ref_zero));
- field_ref_zero = nullptr;
-
if (!ok) {
goto fail;
}
@@ -6932,6 +6919,20 @@ static int main_low(char** argv)
}
}
+ ut_ad(!field_ref_zero);
+ if (auto b = aligned_malloc(UNIV_PAGE_SIZE_MAX, 4096)) {
+ field_ref_zero = static_cast<byte*>(
+ memset_aligned<4096>(b, 0, UNIV_PAGE_SIZE_MAX));
+ } else {
+ msg("Can't allocate memory for field_ref_zero");
+ return EXIT_FAILURE;
+ }
+
+ auto _ = make_scope_exit([]() {
+ aligned_free(const_cast<byte*>(field_ref_zero));
+ field_ref_zero = nullptr;
+ });
+
/* --backup */
if (xtrabackup_backup && !xtrabackup_backup_func()) {
return(EXIT_FAILURE);