Commit 5191e5ab authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-25031 Not applying INSERT_*_REDUNDANT due to corruption on page

page_apply_insert_redundant(): Replace a too strict condition
hdr_c > pextra_size. It turns out that page_cur_insert_rec_low()
is not even computing the extra_size of cur->rec when it is trying
to reuse header bytes of the preceding record.
parent 44987145
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, 2020, MariaDB Corporation. Copyright (c) 2018, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -205,7 +205,7 @@ page_cur_delete_rec( ...@@ -205,7 +205,7 @@ page_cur_delete_rec(
written by page_cur_insert_rec_low() for a ROW_FORMAT=REDUNDANT page. written by page_cur_insert_rec_low() for a ROW_FORMAT=REDUNDANT page.
@param block B-tree or R-tree page in ROW_FORMAT=COMPACT or DYNAMIC @param block B-tree or R-tree page in ROW_FORMAT=COMPACT or DYNAMIC
@param reuse false=allocate from PAGE_HEAP_TOP; true=reuse PAGE_FREE @param reuse false=allocate from PAGE_HEAP_TOP; true=reuse PAGE_FREE
@param prev byte offset of the predecessor, relative to PAGE_NEW_INFIMUM @param prev byte offset of the predecessor, relative to PAGE_OLD_INFIMUM
@param enc_hdr encoded fixed-size header bits @param enc_hdr encoded fixed-size header bits
@param hdr_c number of common record header bytes with prev @param hdr_c number of common record header bytes with prev
@param data_c number of common data bytes with prev @param data_c number of common data bytes with prev
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2018, 2020, MariaDB Corporation. Copyright (c) 2018, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -2288,7 +2288,7 @@ page_cur_delete_rec( ...@@ -2288,7 +2288,7 @@ page_cur_delete_rec(
written by page_cur_insert_rec_low() for a ROW_FORMAT=REDUNDANT page. written by page_cur_insert_rec_low() for a ROW_FORMAT=REDUNDANT page.
@param block B-tree or R-tree page in ROW_FORMAT=COMPACT or DYNAMIC @param block B-tree or R-tree page in ROW_FORMAT=COMPACT or DYNAMIC
@param reuse false=allocate from PAGE_HEAP_TOP; true=reuse PAGE_FREE @param reuse false=allocate from PAGE_HEAP_TOP; true=reuse PAGE_FREE
@param prev byte offset of the predecessor, relative to PAGE_NEW_INFIMUM @param prev byte offset of the predecessor, relative to PAGE_OLD_INFIMUM
@param enc_hdr encoded fixed-size header bits @param enc_hdr encoded fixed-size header bits
@param hdr_c number of common record header bytes with prev @param hdr_c number of common record header bytes with prev
@param data_c number of common data bytes with prev @param data_c number of common data bytes with prev
...@@ -2350,6 +2350,8 @@ bool page_apply_insert_redundant(const buf_block_t &block, bool reuse, ...@@ -2350,6 +2350,8 @@ bool page_apply_insert_redundant(const buf_block_t &block, bool reuse,
if (prev_rec == &block.frame[PAGE_OLD_INFIMUM]); if (prev_rec == &block.frame[PAGE_OLD_INFIMUM]);
else if (UNIV_UNLIKELY(prev_rec - pextra_size < heap_bot)) else if (UNIV_UNLIKELY(prev_rec - pextra_size < heap_bot))
goto corrupted; goto corrupted;
if (UNIV_UNLIKELY(hdr_c && prev_rec - hdr_c < heap_bot))
goto corrupted;
const ulint pdata_size= rec_get_data_size_old(prev_rec); const ulint pdata_size= rec_get_data_size_old(prev_rec);
if (UNIV_UNLIKELY(prev_rec + pdata_size > heap_top)) if (UNIV_UNLIKELY(prev_rec + pdata_size > heap_top))
goto corrupted; goto corrupted;
...@@ -2365,7 +2367,7 @@ bool page_apply_insert_redundant(const buf_block_t &block, bool reuse, ...@@ -2365,7 +2367,7 @@ bool page_apply_insert_redundant(const buf_block_t &block, bool reuse,
const ulint extra_size= REC_N_OLD_EXTRA_BYTES + const ulint extra_size= REC_N_OLD_EXTRA_BYTES +
(is_short ? n_fields : n_fields * 2); (is_short ? n_fields : n_fields * 2);
hdr_c+= REC_N_OLD_EXTRA_BYTES; hdr_c+= REC_N_OLD_EXTRA_BYTES;
if (UNIV_UNLIKELY(hdr_c > extra_size || hdr_c > pextra_size)) if (UNIV_UNLIKELY(hdr_c > extra_size))
goto corrupted; goto corrupted;
if (UNIV_UNLIKELY(extra_size - hdr_c > data_len)) if (UNIV_UNLIKELY(extra_size - hdr_c > data_len))
goto corrupted; goto corrupted;
......
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