summaryrefslogtreecommitdiff
path: root/storage/innobase/include/btr0pcur.h
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-04-13 10:28:13 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-04-13 10:28:13 +0300
commitb8c8692fd93b68df8f70db5ffab82ed0d67008b3 (patch)
tree9d804937ebb94f5e7bba419f23166efe4bfad118 /storage/innobase/include/btr0pcur.h
parent6e6318b29b446f76f01f2ef65d1460870b607d2a (diff)
downloadmariadb-git-b8c8692fd93b68df8f70db5ffab82ed0d67008b3.tar.gz
MDEV-24620 ASAN heap-buffer-overflow in btr_pcur_restore_position()bb-10.3-MDEV-24620
Between btr_pcur_store_position() and btr_pcur_restore_position() it is possible that purge empties a table and enlarges index->n_core_fields and index->n_core_null_bytes. Therefore, we must cache index->n_core_fields in btr_pcur_t::old_n_core_fields so that btr_pcur_t::old_rec can be parsed correctly. Unfortunately, this is a huge change, because we will replace "bool leaf" parameters with "ulint n_core" (passing index->n_core_fields, or 0 for non-leaf pages). For special cases where we know that index->is_instant() cannot hold, we may also pass index->n_fields.
Diffstat (limited to 'storage/innobase/include/btr0pcur.h')
-rw-r--r--storage/innobase/include/btr0pcur.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/storage/innobase/include/btr0pcur.h b/storage/innobase/include/btr0pcur.h
index 38960b1d15c..b0b61a4d1ff 100644
--- a/storage/innobase/include/btr0pcur.h
+++ b/storage/innobase/include/btr0pcur.h
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, 2020, MariaDB Corporation.
+Copyright (c) 2017, 2021, MariaDB Corporation.
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
@@ -497,8 +497,10 @@ struct btr_pcur_t{
/** if cursor position is stored, contains an initial segment of the
latest record cursor was positioned either on, before or after */
rec_t* old_rec;
+ /** btr_cur.index->n_core_fields when old_rec was copied */
+ uint16 old_n_core_fields;
/** number of fields in old_rec */
- ulint old_n_fields;
+ uint16 old_n_fields;
/** BTR_PCUR_ON, BTR_PCUR_BEFORE, or BTR_PCUR_AFTER, depending on
whether cursor was on, before, or after the old_rec record */
enum btr_pcur_pos_t rel_pos;