summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-12-18 09:52:28 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2018-12-18 09:52:28 +0200
commit84f119f25c6464b791ae7b494d6dadf0c5974477 (patch)
tree188d1ffb4430af6b872444acc67e7876d7c37d36
parent51a1fc737c26570386220edd4d8e69e873b8dfa7 (diff)
downloadmariadb-git-84f119f25c6464b791ae7b494d6dadf0c5974477.tar.gz
MDEV-12112/MDEV-12114: Relax strict_innodb, strict_none
Starting with commit 6b6987154a23a8eba72fd58cbff915ae6d17189f the encrypted page checksum is only computed with crc32. Encrypted data pages that were written earlier can contain other checksums, but new ones will only contain crc32. Because of this, it does not make sense to implement strict checks of innodb_checksum_algorithm for other than strict_crc32. fil_space_verify_crypt_checksum(): Treat strict_innodb as innodb and strict_none as none. That is, allow a match from any of the algorithms none, innodb, crc32. (This is how it worked before the second MDEV-12112 fix.) Thanks to Thirunarayanan Balathandayuthapani for pointing this out.
-rw-r--r--storage/innobase/fil/fil0crypt.cc33
-rw-r--r--storage/xtradb/fil/fil0crypt.cc33
2 files changed, 28 insertions, 38 deletions
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc
index aeaa420aa4d..03cfa8d9fbc 100644
--- a/storage/innobase/fil/fil0crypt.cc
+++ b/storage/innobase/fil/fil0crypt.cc
@@ -2588,10 +2588,8 @@ bool fil_space_verify_crypt_checksum(const byte* page, ulint zip_size)
/* If stored checksum matches one of the calculated checksums
page is not corrupted. */
- srv_checksum_algorithm_t algorithm = srv_checksum_algorithm_t(
- srv_checksum_algorithm);
- switch (algorithm) {
+ switch (srv_checksum_algorithm_t(srv_checksum_algorithm)) {
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
if (zip_size) {
return checksum == page_zip_calc_checksum(
@@ -2599,32 +2597,29 @@ bool fil_space_verify_crypt_checksum(const byte* page, ulint zip_size)
}
return checksum == buf_calc_page_crc32(page);
- case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
- if (zip_size) {
- return checksum == page_zip_calc_checksum(
- page, zip_size, SRV_CHECKSUM_ALGORITHM_INNODB);
- }
- return checksum == buf_calc_page_new_checksum(page);
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
- return checksum == BUF_NO_CHECKSUM_MAGIC;
+ /* Starting with MariaDB 10.1.25, 10.2.7, 10.3.1,
+ due to MDEV-12114, fil_crypt_calculate_checksum()
+ is only using CRC32 for the encrypted pages.
+ Due to this, we must treat "strict_none" as "none". */
case SRV_CHECKSUM_ALGORITHM_NONE:
return true;
+ case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
+ /* Starting with MariaDB 10.1.25, 10.2.7, 10.3.1,
+ due to MDEV-12114, fil_crypt_calculate_checksum()
+ is only using CRC32 for the encrypted pages.
+ Due to this, we must treat "strict_innodb" as "innodb". */
case SRV_CHECKSUM_ALGORITHM_INNODB:
case SRV_CHECKSUM_ALGORITHM_CRC32:
if (checksum == BUF_NO_CHECKSUM_MAGIC) {
return true;
}
if (zip_size) {
- if (checksum == page_zip_calc_checksum(
- page, zip_size, algorithm)) {
- return true;
- }
-
- algorithm = algorithm == SRV_CHECKSUM_ALGORITHM_INNODB
- ? SRV_CHECKSUM_ALGORITHM_CRC32
- : SRV_CHECKSUM_ALGORITHM_INNODB;
return checksum == page_zip_calc_checksum(
- page, zip_size, algorithm);
+ page, zip_size, SRV_CHECKSUM_ALGORITHM_CRC32)
+ || checksum == page_zip_calc_checksum(
+ page, zip_size,
+ SRV_CHECKSUM_ALGORITHM_INNODB);
}
return checksum == buf_calc_page_crc32(page)
diff --git a/storage/xtradb/fil/fil0crypt.cc b/storage/xtradb/fil/fil0crypt.cc
index aeaa420aa4d..03cfa8d9fbc 100644
--- a/storage/xtradb/fil/fil0crypt.cc
+++ b/storage/xtradb/fil/fil0crypt.cc
@@ -2588,10 +2588,8 @@ bool fil_space_verify_crypt_checksum(const byte* page, ulint zip_size)
/* If stored checksum matches one of the calculated checksums
page is not corrupted. */
- srv_checksum_algorithm_t algorithm = srv_checksum_algorithm_t(
- srv_checksum_algorithm);
- switch (algorithm) {
+ switch (srv_checksum_algorithm_t(srv_checksum_algorithm)) {
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
if (zip_size) {
return checksum == page_zip_calc_checksum(
@@ -2599,32 +2597,29 @@ bool fil_space_verify_crypt_checksum(const byte* page, ulint zip_size)
}
return checksum == buf_calc_page_crc32(page);
- case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
- if (zip_size) {
- return checksum == page_zip_calc_checksum(
- page, zip_size, SRV_CHECKSUM_ALGORITHM_INNODB);
- }
- return checksum == buf_calc_page_new_checksum(page);
case SRV_CHECKSUM_ALGORITHM_STRICT_NONE:
- return checksum == BUF_NO_CHECKSUM_MAGIC;
+ /* Starting with MariaDB 10.1.25, 10.2.7, 10.3.1,
+ due to MDEV-12114, fil_crypt_calculate_checksum()
+ is only using CRC32 for the encrypted pages.
+ Due to this, we must treat "strict_none" as "none". */
case SRV_CHECKSUM_ALGORITHM_NONE:
return true;
+ case SRV_CHECKSUM_ALGORITHM_STRICT_INNODB:
+ /* Starting with MariaDB 10.1.25, 10.2.7, 10.3.1,
+ due to MDEV-12114, fil_crypt_calculate_checksum()
+ is only using CRC32 for the encrypted pages.
+ Due to this, we must treat "strict_innodb" as "innodb". */
case SRV_CHECKSUM_ALGORITHM_INNODB:
case SRV_CHECKSUM_ALGORITHM_CRC32:
if (checksum == BUF_NO_CHECKSUM_MAGIC) {
return true;
}
if (zip_size) {
- if (checksum == page_zip_calc_checksum(
- page, zip_size, algorithm)) {
- return true;
- }
-
- algorithm = algorithm == SRV_CHECKSUM_ALGORITHM_INNODB
- ? SRV_CHECKSUM_ALGORITHM_CRC32
- : SRV_CHECKSUM_ALGORITHM_INNODB;
return checksum == page_zip_calc_checksum(
- page, zip_size, algorithm);
+ page, zip_size, SRV_CHECKSUM_ALGORITHM_CRC32)
+ || checksum == page_zip_calc_checksum(
+ page, zip_size,
+ SRV_CHECKSUM_ALGORITHM_INNODB);
}
return checksum == buf_calc_page_crc32(page)