Browse Source
MDEV-14874 innodb_encrypt_log corrupts the log when the LSN crosses 32-bit boundary
MDEV-14874 innodb_encrypt_log corrupts the log when the LSN crosses 32-bit boundary
This bug affects both writing and reading encrypted redo log in MariaDB 10.1, starting from version 10.1.3 which added support for innodb_encrypt_log. That is, InnoDB crash recovery and Mariabackup will sometimes fail when innodb_encrypt_log is used. MariaDB 10.2 or Mariabackup 10.2 or later versions are not affected. log_block_get_start_lsn(): Remove. This function would cause trouble if a log segment that is being read is crossing a 32-bit boundary of the LSN, because this function does not allow the most significant 32 bits of the LSN to change. log_blocks_crypt(), log_encrypt_before_write(), log_decrypt_after_read(): Add the parameter "lsn" for the start LSN of the block. log_blocks_encrypt(): Remove (unused function).pull/550/head
10 changed files with 124 additions and 87 deletions
-
2extra/mariabackup/xtrabackup.cc
-
6mysql-test/suite/mariabackup/huge_lsn.opt
-
18mysql-test/suite/mariabackup/huge_lsn.result
-
51mysql-test/suite/mariabackup/huge_lsn.test
-
6storage/innobase/include/log0crypt.h
-
54storage/innobase/log/log0crypt.cc
-
7storage/innobase/log/log0log.cc
-
6storage/xtradb/include/log0crypt.h
-
54storage/xtradb/log/log0crypt.cc
-
7storage/xtradb/log/log0log.cc
@ -0,0 +1,6 @@ |
|||
--innodb-encrypt-log=ON |
|||
--plugin-load-add=$FILE_KEY_MANAGEMENT_SO |
|||
--loose-file-key-management |
|||
--loose-file-key-management-filekey=FILE:$MTR_SUITE_DIR/filekeys-data.key |
|||
--loose-file-key-management-filename=$MTR_SUITE_DIR/filekeys-data.enc |
|||
--loose-file-key-management-encryption-algorithm=aes_cbc |
@ -0,0 +1,18 @@ |
|||
# |
|||
# MDEV-13416 mariabackup fails with EFAULT "Bad Address" |
|||
# |
|||
call mtr.add_suppression("InnoDB: New log files created"); |
|||
FOUND /InnoDB: .*started; log sequence number 17596481010700/ in mysqld.1.err |
|||
CREATE TABLE t(i INT) ENGINE INNODB; |
|||
INSERT INTO t VALUES(1); |
|||
# xtrabackup backup |
|||
INSERT INTO t VALUES(2); |
|||
# xtrabackup prepare |
|||
# shutdown server |
|||
# remove datadir |
|||
# xtrabackup move back |
|||
# restart server |
|||
SELECT * FROM t; |
|||
i |
|||
1 |
|||
DROP TABLE t; |
@ -0,0 +1,51 @@ |
|||
--source include/not_embedded.inc |
|||
|
|||
--echo # |
|||
--echo # MDEV-13416 mariabackup fails with EFAULT "Bad Address" |
|||
--echo # |
|||
|
|||
let INNODB_PAGE_SIZE=`select @@innodb_page_size`; |
|||
let MYSQLD_DATADIR=`select @@datadir`; |
|||
call mtr.add_suppression("InnoDB: New log files created"); |
|||
|
|||
--source include/shutdown_mysqld.inc |
|||
|
|||
perl; |
|||
my $file= "$ENV{MYSQLD_DATADIR}/ibdata1"; |
|||
open(FILE, "+<", $file) or die "Unable to open $file\n"; |
|||
binmode FILE; |
|||
my $ps= $ENV{INNODB_PAGE_SIZE}; |
|||
my $page; |
|||
die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; |
|||
substr($page,26,8) = pack("NN", 4096, ~1024); |
|||
substr($page,0,4)=pack("N",0xdeadbeef); |
|||
substr($page,$ps-8,4)=pack("N",0xdeadbeef); |
|||
sysseek(FILE, 0, 0) || die "Unable to rewind $file\n"; |
|||
syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; |
|||
close(FILE) || die "Unable to close $file\n"; |
|||
EOF |
|||
|
|||
--remove_files_wildcard $MYSQLD_DATADIR ib_logfile* |
|||
|
|||
--source include/start_mysqld.inc |
|||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; |
|||
--let SEARCH_PATTERN= InnoDB: .*started; log sequence number 17596481010700 |
|||
--source include/search_pattern_in_file.inc |
|||
|
|||
CREATE TABLE t(i INT) ENGINE INNODB; |
|||
INSERT INTO t VALUES(1); |
|||
|
|||
echo # xtrabackup backup; |
|||
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; |
|||
--disable_result_log |
|||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; |
|||
--enable_result_log |
|||
INSERT INTO t VALUES(2); |
|||
echo # xtrabackup prepare; |
|||
--disable_result_log |
|||
exec $XTRABACKUP --prepare --target-dir=$targetdir; |
|||
--source include/restart_and_restore.inc |
|||
--enable_result_log |
|||
SELECT * FROM t; |
|||
DROP TABLE t; |
|||
rmdir $targetdir; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue