diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-03-12 13:43:33 +0200 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-03-12 13:43:33 +0200 |
commit | f341d94423daa37bf4bee4d9b96ba8e8d93484c6 (patch) | |
tree | a9f62d842c6f1747ab584bd2095ffe62bcd7bc44 /storage/innobase | |
parent | 8c2fd5537b1029a514591f622674f1ceb04fa67e (diff) | |
download | mariadb-git-f341d94423daa37bf4bee4d9b96ba8e8d93484c6.tar.gz |
MDEV-9549: Trying to decrypt a not encrypted page
Make sure that on decrypt we do not try to reference
NULL pointer and if page contains undefined
FIL_PAGE_FILE_FLUSH_LSN field on when page is not
the first page or page is not in system tablespace,
clear it.
Diffstat (limited to 'storage/innobase')
-rw-r--r-- | storage/innobase/fil/fil0crypt.cc | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 03020896542..01b3991af24 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -712,21 +712,37 @@ fil_space_decrypt( ulint page_type = mach_read_from_2(src_frame+FIL_PAGE_TYPE); uint key_version = mach_read_from_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - + ulint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET); + ulint space = mach_read_from_4(src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); + ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN); *err = DB_SUCCESS; if (key_version == ENCRYPTION_KEY_NOT_ENCRYPTED) { return false; } - ut_ad(crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF); + if (crypt_data == NULL) { + if (space != 0 && offset != 0 && key_version != 0) { + /* FIL_PAGE_FILE_FLUSH_LSN field i.e. + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + should be only defined for the + first page in a system tablespace + data file (ibdata*, not *.ibd), if not + clear it. */ +#ifdef UNIV_DEBUG + ib_logf(IB_LOG_LEVEL_WARN, + "Page on space %lu offset %lu has key_version %u" + " when it shoud be undefined.", + space, offset, key_version); +#endif + mach_write_to_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0); + } + return false; + } - /* read space & offset & lsn */ - ulint space = mach_read_from_4( - src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - ulint offset = mach_read_from_4( - src_frame + FIL_PAGE_OFFSET); - ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN); + ut_ad(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF); + + /* read space & lsn */ ulint header_len = FIL_PAGE_DATA; if (page_compressed) { |