Skip to content

Commit 5feb60c

Browse files
committed
MDEV-22590 SIGSEGV in flush_all_key_blocks when changing key_buffer_size / ASAN: heap-use-after-free in flush_all_key_blocks
Take into account that in preparation of a simple key cache for resizing no disk blocks might be assigned to it. Reviewer: IgorBabaev <igor@mariadb.com>
1 parent 3e09c61 commit 5feb60c

File tree

3 files changed

+44
-1
lines changed

3 files changed

+44
-1
lines changed

mysql-test/main/key_cache.result

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,3 +834,25 @@ set global keycache2.key_buffer_size=0;
834834
set global key_buffer_size=@save_key_buffer_size;
835835
set global key_cache_segments=@save_key_cache_segments;
836836
set global key_cache_file_hash_size=@save_key_cache_file_hash_size;
837+
#
838+
# SIGSEGV in flush_all_key_blocks when changing
839+
# key_buffer_size / ASAN: heap-use-after-free in flush_all_key_blocks
840+
#
841+
SET GLOBAL keycache1.key_cache_segments=7;
842+
SET GLOBAL keycache1.key_buffer_size=1*1024*1024;
843+
SET GLOBAL keycache1.key_buffer_size=0;
844+
SET GLOBAL keycache1.key_buffer_size=128*1024;
845+
create table t1 (p int primary key, a char(10)) delay_key_write=1;
846+
cache index t1 key (`primary`) in keycache1;
847+
Table Op Msg_type Msg_text
848+
test.t1 assign_to_keycache status OK
849+
insert into t1 values (1, 'qqqq'), (11, 'yyyy');
850+
select * from t1;
851+
p a
852+
1 qqqq
853+
11 yyyy
854+
drop table t1;
855+
SET GLOBAL keycache1.key_buffer_size=0;
856+
#
857+
# End of 10.3 tests
858+
#

mysql-test/main/key_cache.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,3 +538,24 @@ set global key_cache_segments=@save_key_cache_segments;
538538
set global key_cache_file_hash_size=@save_key_cache_file_hash_size;
539539

540540
# End of 5.2 tests
541+
542+
--echo #
543+
--echo # SIGSEGV in flush_all_key_blocks when changing
544+
--echo # key_buffer_size / ASAN: heap-use-after-free in flush_all_key_blocks
545+
--echo #
546+
547+
SET GLOBAL keycache1.key_cache_segments=7;
548+
SET GLOBAL keycache1.key_buffer_size=1*1024*1024;
549+
SET GLOBAL keycache1.key_buffer_size=0;
550+
SET GLOBAL keycache1.key_buffer_size=128*1024;
551+
create table t1 (p int primary key, a char(10)) delay_key_write=1;
552+
cache index t1 key (`primary`) in keycache1;
553+
insert into t1 values (1, 'qqqq'), (11, 'yyyy');
554+
select * from t1;
555+
drop table t1;
556+
SET GLOBAL keycache1.key_buffer_size=0;
557+
558+
559+
--echo #
560+
--echo # End of 10.3 tests
561+
--echo #

mysys/mf_keycache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ int prepare_resize_simple_key_cache(SIMPLE_KEY_CACHE_CB *keycache,
701701
keycache->in_resize= 1;
702702

703703
/* Need to flush only if keycache is enabled. */
704-
if (keycache->can_be_used)
704+
if (keycache->can_be_used && keycache->disk_blocks != -1)
705705
{
706706
/* Start the flush phase. */
707707
keycache->resize_in_flush= 1;

0 commit comments

Comments
 (0)