Commit 06079a4c authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.4 into 10.5

parents a2a0ac7c 89723ce1
--source include/have_innodb.inc --source include/have_innodb.inc
-- source include/have_example_key_management_plugin.inc --source include/have_example_key_management_plugin.inc
--source include/innodb_checksum_algorithm.inc
--echo # --echo #
--echo # MDEV-26131 SEGV in ha_innobase::discard_or_import_tablespace --echo # MDEV-26131 SEGV in ha_innobase::discard_or_import_tablespace
--echo # --echo #
......
--innodb_checksum_algorithm=full_crc32
...@@ -138,6 +138,7 @@ EOF ...@@ -138,6 +138,7 @@ EOF
ALTER TABLE t1 IMPORT TABLESPACE; ALTER TABLE t1 IMPORT TABLESPACE;
--enable_warnings --enable_warnings
ALTER TABLE t1 DROP INDEX idx1; ALTER TABLE t1 DROP INDEX idx1;
--replace_regex /opening '.*\/test\//opening '.\/test\//
ALTER TABLE t1 IMPORT TABLESPACE; ALTER TABLE t1 IMPORT TABLESPACE;
--disable_warnings --disable_warnings
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
......
...@@ -695,7 +695,7 @@ struct FetchIndexRootPages : public AbstractCallback { ...@@ -695,7 +695,7 @@ struct FetchIndexRootPages : public AbstractCallback {
@param block Block to use for IO @param block Block to use for IO
@retval DB_SUCCESS or error code */ @retval DB_SUCCESS or error code */
dberr_t run(const fil_iterator_t& iter, dberr_t run(const fil_iterator_t& iter,
buf_block_t* block) UNIV_NOTHROW; buf_block_t* block) UNIV_NOTHROW override;
/** Called for each block as it is read from the file. /** Called for each block as it is read from the file.
@param block block to convert, it is not from the buffer pool. @param block block to convert, it is not from the buffer pool.
...@@ -866,7 +866,8 @@ class PageConverter : public AbstractCallback { ...@@ -866,7 +866,8 @@ class PageConverter : public AbstractCallback {
} }
} }
dberr_t run(const fil_iterator_t& iter, buf_block_t* block) UNIV_NOTHROW dberr_t run(const fil_iterator_t& iter,
buf_block_t* block) UNIV_NOTHROW override
{ {
return fil_iterate(iter, block, *this); return fil_iterate(iter, block, *this);
} }
...@@ -3435,6 +3436,8 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter, ...@@ -3435,6 +3436,8 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter,
#endif #endif
srv_page_size; srv_page_size;
byte* page_compress_buf = static_cast<byte*>(malloc(buf_size)); byte* page_compress_buf = static_cast<byte*>(malloc(buf_size));
const bool full_crc32 = fil_space_t::full_crc32(m_space_flags);
bool skip_checksum_check = false;
ut_ad(!srv_read_only_mode); ut_ad(!srv_read_only_mode);
if (!page_compress_buf) if (!page_compress_buf)
...@@ -3468,17 +3471,22 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter, ...@@ -3468,17 +3471,22 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter,
} }
block->page.id_.set_page_no(3); block->page.id_.set_page_no(3);
switch (fil_page_get_type(readptr)) { if (full_crc32 && fil_space_t::is_compressed(m_space_flags))
case FIL_PAGE_PAGE_COMPRESSED: page_compressed= buf_page_is_compressed(readptr, m_space_flags);
case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: else
if (block->page.zip.data) {
goto page_corrupted; switch (fil_page_get_type(readptr)) {
page_compressed= true; case FIL_PAGE_PAGE_COMPRESSED:
case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED:
if (block->page.zip.data)
goto page_corrupted;
page_compressed= true;
}
} }
if (encrypted) if (encrypted)
{ {
if (!fil_space_verify_crypt_checksum(readptr, zip_size)) if (!buf_page_verify_crypt_checksum(readptr, m_space_flags))
goto page_corrupted; goto page_corrupted;
if (!fil_space_decrypt(get_space_id(), iter.crypt_data, readptr, if (!fil_space_decrypt(get_space_id(), iter.crypt_data, readptr,
...@@ -3487,15 +3495,21 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter, ...@@ -3487,15 +3495,21 @@ dberr_t FetchIndexRootPages::run(const fil_iterator_t& iter,
goto func_exit; goto func_exit;
} }
/* For full_crc32 format, skip checksum check
after decryption. */
skip_checksum_check= full_crc32 && encrypted;
if (page_compressed) if (page_compressed)
{ {
ulint compress_length= fil_page_decompress(page_compress_buf, readptr, ulint compress_length= fil_page_decompress(page_compress_buf,
readptr,
m_space_flags); m_space_flags);
ut_ad(compress_length != srv_page_size); ut_ad(compress_length != srv_page_size);
if (compress_length == 0) if (compress_length == 0)
goto page_corrupted; goto page_corrupted;
} }
else if (buf_page_is_corrupted(false, readptr, m_space_flags)) else if (!skip_checksum_check
&& buf_page_is_corrupted(false, readptr, m_space_flags))
goto page_corrupted; goto page_corrupted;
err= this->operator()(block); err= this->operator()(block);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment