summaryrefslogtreecommitdiff
path: root/storage/innobase/ibuf/ibuf0ibuf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/ibuf/ibuf0ibuf.cc')
-rw-r--r--storage/innobase/ibuf/ibuf0ibuf.cc56
1 files changed, 38 insertions, 18 deletions
diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc
index 94c01f5108a..6fb41cfbd81 100644
--- a/storage/innobase/ibuf/ibuf0ibuf.cc
+++ b/storage/innobase/ibuf/ibuf0ibuf.cc
@@ -2035,23 +2035,25 @@ ibuf_get_merge_page_nos_func(
*n_stored = 0;
- limit = ut_min(IBUF_MAX_N_PAGES_MERGED,
- buf_pool_get_curr_size() / 4);
-
if (page_rec_is_supremum(rec)) {
rec = page_rec_get_prev_const(rec);
+ if (UNIV_UNLIKELY(!rec)) {
+corruption:
+ ut_ad("corrupted page" == 0);
+ return 0;
+ }
}
if (page_rec_is_infimum(rec)) {
-
rec = page_rec_get_next_const(rec);
+ if (page_rec_is_supremum(rec)) {
+ return 0;
+ }
}
- if (page_rec_is_supremum(rec)) {
-
- return(0);
- }
+ limit = ut_min(IBUF_MAX_N_PAGES_MERGED,
+ buf_pool_get_curr_size() / 4);
first_page_no = ibuf_rec_get_page_no(mtr, rec);
first_space_id = ibuf_rec_get_space(mtr, rec);
@@ -2083,7 +2085,9 @@ ibuf_get_merge_page_nos_func(
prev_page_no = rec_page_no;
prev_space_id = rec_space_id;
- rec = page_rec_get_prev_const(rec);
+ if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
+ goto corruption;
+ }
}
rec = page_rec_get_next_const(rec);
@@ -2809,14 +2813,16 @@ ibuf_get_volume_buffered(
page = page_align(rec);
ut_ad(page_validate(page, ibuf.index));
- if (page_rec_is_supremum(rec)) {
- rec = page_rec_get_prev_const(rec);
+ if (page_rec_is_supremum(rec)
+ && UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
+corruption:
+ ut_ad("corrupted page" == 0);
+ return srv_page_size;
}
uint32_t prev_page_no;
- for (; !page_rec_is_infimum(rec);
- rec = page_rec_get_prev_const(rec)) {
+ for (; !page_rec_is_infimum(rec); ) {
ut_ad(page_align(rec) == page);
if (page_no != ibuf_rec_get_page_no(mtr, rec)
@@ -2828,6 +2834,10 @@ ibuf_get_volume_buffered(
volume += ibuf_get_volume_buffered_count(
mtr, rec,
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
+
+ if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
+ goto corruption;
+ }
}
/* Look at the previous page */
@@ -2853,13 +2863,16 @@ ibuf_get_volume_buffered(
if (UNIV_UNLIKELY(memcmp_aligned<4>(prev_page + FIL_PAGE_NEXT,
page + FIL_PAGE_OFFSET, 4))) {
- return 0;
+ return srv_page_size;
}
- rec = page_get_supremum_rec(prev_page);
- rec = page_rec_get_prev_const(rec);
+ rec = page_rec_get_prev_const(page_get_supremum_rec(prev_page));
- for (;; rec = page_rec_get_prev_const(rec)) {
+ if (UNIV_UNLIKELY(!rec)) {
+ goto corruption;
+ }
+
+ for (;;) {
ut_ad(page_align(rec) == prev_page);
if (page_rec_is_infimum(rec)) {
@@ -2880,6 +2893,10 @@ ibuf_get_volume_buffered(
volume += ibuf_get_volume_buffered_count(
mtr, rec,
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
+
+ if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
+ goto corruption;
+ }
}
count_later:
@@ -3801,7 +3818,10 @@ ibuf_insert_to_index_page(
buffered one. */
page_cur_delete_rec(&page_cur, index, offsets, mtr);
- page_cur_move_to_prev(&page_cur);
+ if (!(page_cur_move_to_prev(&page_cur))) {
+ err = DB_CORRUPTION;
+ goto updated_in_place;
+ }
} else {
offsets = NULL;
}