Browse Source
MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys
MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys
Add error handling to btr_validate_index when index root block can't be read because block decryption fails.pull/99/head
8 changed files with 188 additions and 37 deletions
-
20mysql-test/suite/encryption/r/innodb-bad-key-change4.result
-
88mysql-test/suite/encryption/t/innodb-bad-key-change4.test
-
20storage/innobase/btr/btr0btr.cc
-
32storage/innobase/handler/ha_innodb.cc
-
6storage/innobase/include/btr0btr.h
-
21storage/xtradb/btr/btr0btr.cc
-
32storage/xtradb/handler/ha_innodb.cc
-
6storage/xtradb/include/btr0btr.h
@ -0,0 +1,20 @@ |
|||
call mtr.add_suppression("InnoDB: Block in space_id .* in file test/.* encrypted"); |
|||
call mtr.add_suppression("InnoDB: However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match."); |
|||
call mtr.add_suppression("InnoDB: Marking tablespace as missing. You may drop this table or install correct key management plugin and key file."); |
|||
call mtr.add_suppression(".*InnoDB: Cannot open table test/.* from the internal data dictionary of InnoDB though the .frm file for the table exists. See .* for how you can resolve the problem."); |
|||
call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*"); |
|||
call mtr.add_suppression("Couldn't load plugins from 'file_key_management*"); |
|||
SET GLOBAL innodb_file_format = `Barracuda`; |
|||
SET GLOBAL innodb_file_per_table = ON; |
|||
CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; |
|||
INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); |
|||
SET GLOBAL innodb_file_format = `Barracuda`; |
|||
SET GLOBAL innodb_file_per_table = ON; |
|||
CHECK TABLE t1; |
|||
Table Op Msg_type Msg_text |
|||
test.t1 check Warning Table test/t1 in tablespace 4 is encrypted but encryption service or used key_id is not available. Can't continue reading table. |
|||
test.t1 check Warning Table test/t1 is encrypted but encryption service or used key_id is not available. Can't continue checking table. |
|||
test.t1 check error Corrupt |
|||
SHOW WARNINGS; |
|||
Level Code Message |
|||
DROP TABLE t1; |
|||
@ -0,0 +1,88 @@ |
|||
--source include/have_innodb.inc |
|||
# embedded does not support restart |
|||
-- source include/not_embedded.inc |
|||
-- source include/not_valgrind.inc |
|||
# Avoid CrashReporter popup on Mac |
|||
-- source include/not_crashrep.inc |
|||
# |
|||
# MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys |
|||
# |
|||
call mtr.add_suppression("InnoDB: Block in space_id .* in file test/.* encrypted"); |
|||
call mtr.add_suppression("InnoDB: However key management plugin or used key_id 1 is not found or used encryption algorithm or method does not match."); |
|||
call mtr.add_suppression("InnoDB: Marking tablespace as missing. You may drop this table or install correct key management plugin and key file."); |
|||
call mtr.add_suppression(".*InnoDB: Cannot open table test/.* from the internal data dictionary of InnoDB though the .frm file for the table exists. See .* for how you can resolve the problem."); |
|||
call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*"); |
|||
# Suppression for builds where file_key_management plugin is linked statically |
|||
call mtr.add_suppression("Couldn't load plugins from 'file_key_management*"); |
|||
|
|||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--shutdown_server |
|||
--source include/wait_until_disconnected.inc |
|||
|
|||
--write_file $MYSQLTEST_VARDIR/keys1.txt |
|||
1;770A8A65DA156D24EE2A093277530142 |
|||
4;770A8A65DA156D24EE2A093277530143 |
|||
EOF |
|||
|
|||
--exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--enable_reconnect |
|||
--source include/wait_until_connected_again.inc |
|||
|
|||
--let $MYSQLD_TMPDIR = `SELECT @@tmpdir` |
|||
--let $MYSQLD_DATADIR = `SELECT @@datadir` |
|||
|
|||
--disable_query_log |
|||
let $innodb_file_format_orig = `SELECT @@innodb_file_format`; |
|||
let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; |
|||
--enable_query_log |
|||
|
|||
SET GLOBAL innodb_file_format = `Barracuda`; |
|||
SET GLOBAL innodb_file_per_table = ON; |
|||
|
|||
CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTION_KEY_ID=4; |
|||
INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); |
|||
|
|||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--shutdown_server |
|||
--source include/wait_until_disconnected.inc |
|||
|
|||
--write_file $MYSQLTEST_VARDIR/keys2.txt |
|||
1;770A8A65DA156D24EE2A093277530142 |
|||
4;770A8A65DA156D24EE2A093277530144 |
|||
EOF |
|||
|
|||
--exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--enable_reconnect |
|||
--source include/wait_until_connected_again.inc |
|||
|
|||
SET GLOBAL innodb_file_format = `Barracuda`; |
|||
SET GLOBAL innodb_file_per_table = ON; |
|||
|
|||
CHECK TABLE t1; |
|||
SHOW WARNINGS; |
|||
|
|||
--remove_file $MYSQLTEST_VARDIR/keys1.txt |
|||
--remove_file $MYSQLTEST_VARDIR/keys2.txt |
|||
|
|||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--shutdown_server |
|||
--source include/wait_until_disconnected.inc |
|||
|
|||
--write_file $MYSQLTEST_VARDIR/keys1.txt |
|||
1;770A8A65DA156D24EE2A093277530142 |
|||
4;770A8A65DA156D24EE2A093277530143 |
|||
EOF |
|||
|
|||
--exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect |
|||
--enable_reconnect |
|||
--source include/wait_until_connected_again.inc |
|||
|
|||
DROP TABLE t1; |
|||
|
|||
--remove_file $MYSQLTEST_VARDIR/keys1.txt |
|||
|
|||
# reset system |
|||
--disable_query_log |
|||
EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; |
|||
EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; |
|||
--enable_query_log |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue