From ca989b830c40d980d020f171b2d8bebdcc585ac1 Mon Sep 17 00:00:00 2001 From: saltonz Date: Mon, 26 Dec 2022 02:11:58 +0000 Subject: [PATCH] [bugfix] fix unsafe memory access to index block --- .../ob_index_block_macro_iterator.cpp | 3 +++ .../blocksstable/ob_index_block_row_scanner.cpp | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/storage/blocksstable/ob_index_block_macro_iterator.cpp b/src/storage/blocksstable/ob_index_block_macro_iterator.cpp index 75f294005..97607049b 100644 --- a/src/storage/blocksstable/ob_index_block_macro_iterator.cpp +++ b/src/storage/blocksstable/ob_index_block_macro_iterator.cpp @@ -378,6 +378,9 @@ int ObDualMacroMetaIterator::get_next_macro_block(ObMacroBlockDesc &block_desc) if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("Dual macro meta iterator not inited", K(ret)); + } else if (OB_ISNULL(macro_meta)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid null pointer to read macro meta", K(ret), K(block_desc), KP(macro_meta)); } else if (OB_UNLIKELY(iter_end_)) { ret = OB_ITER_END; } else if (OB_SUCC(macro_iter_.get_next_macro_block(block_desc))) { diff --git a/src/storage/blocksstable/ob_index_block_row_scanner.cpp b/src/storage/blocksstable/ob_index_block_row_scanner.cpp index 0a3b084d4..8a893fb51 100644 --- a/src/storage/blocksstable/ob_index_block_row_scanner.cpp +++ b/src/storage/blocksstable/ob_index_block_row_scanner.cpp @@ -431,8 +431,23 @@ int ObIndexBlockRowScanner::check_blockscan( } } else { int cmp_ret = 0; - if (OB_FAIL((idx_data_header_->rowkey_array_ + end_)->compare(rowkey, index_read_info_->get_datum_utils(), cmp_ret))) { + if (!is_transformed_) { + ObDatumRowkey last_endkey; + ObDatumRow tmp_datum_row; // Normally will use local datum buf, won't allocate memory + if (OB_FAIL(tmp_datum_row.init(index_read_info_->get_request_count()))) { + LOG_WARN("Fail to init tmp_datum_row", K(ret)); + } else if (OB_FAIL(micro_reader_->get_row(end_, tmp_datum_row))) { + LOG_WARN("Fail to get last row of micro block", K(ret), K_(end)); + } else if (OB_FAIL(last_endkey.assign(tmp_datum_row.storage_datums_, index_read_info_->get_rowkey_count()))) { + LOG_WARN("Fail to assign storage datum to endkey", K(ret), K(tmp_datum_row)); + } else if (OB_FAIL(last_endkey.compare(rowkey, index_read_info_->get_datum_utils(), cmp_ret))) { + LOG_WARN("Fail to compare rowkey", K(ret), K(last_endkey), K(rowkey)); + } + } else if (OB_FAIL((idx_data_header_->rowkey_array_ + end_)->compare(rowkey, index_read_info_->get_datum_utils(), cmp_ret))) { LOG_WARN("Fail to compare rowkey", K(ret), K(rowkey)); + } + + if (OB_FAIL(ret)) { } else if (cmp_ret < 0) { can_blockscan = true; } else {