mariadb/mysql-test/suite/rpl/t/rpl_parallel_29322.test
Andrei 5563202089 MDEV-29322 ASAN heap-use-after-free in Query_log_event::do_apply_event
The ASAN report was made in the parallel slave execution of a query
event and implicitly involved (so also parallelly run) Format-Description
event.
The Query actually had unexpected impossible dependency on a preceding
"old" FD whose instance got destructed, to cause the ASAN error.

The case is fixed with storing the FD's value into Query-log-event
at its instantiating on slave. The stored value is from the very
FD of the Query's original binlog so remains to be correct
at the query event applying.

The branch C. of a new rpl_parallel_29322.test also demonstrates
(may need few --repeat though) the bug in its simple form of the same
server version binlog.
2022-09-07 20:35:43 +03:00

64 lines
2.5 KiB
Text

--echo #
--echo # MDEV-29322 ASAN use-after-free options_written_to_bin_log
--echo #
# The tests verify that at query execution slave parallel workers successfully
# find a correct options_written_to_bin_log value associated with the query.
# There are three test branches, A and B take care of different server version
# binlogs. The homogeneous binlog case of C. branch is also for how-to-reproduce
# the bug, may need few --repeat :s though.
--source include/have_binlog_format_mixed.inc
--source include/master-slave.inc
--echo # A. set the master and slave explicit_defaults_for_timestamp values crisscross to (1,0)
--let $same_version_binlogs=0
--connection master
# Configure master and slave with different values of the following variable:
set @sav.explicit_defaults_for_timestamp = @@session.explicit_defaults_for_timestamp;
set @@session.explicit_defaults_for_timestamp = 1;
--connection slave
# slave must produce the master version of the table definition and its data
set @sav.explicit_defaults_for_timestamp = @@global.explicit_defaults_for_timestamp;
set global explicit_defaults_for_timestamp = 0;
# the global var gets changed in the included file
set @sav.slave_parallel_workers = @@global.slave_parallel_workers;
--source include/stop_slave.inc
set @@global.slave_parallel_workers = 1;
--source include/start_slave.inc
--source suite/rpl/include/rpl_parallel_29322.inc
--echo # B. alternate the master and slave vars' values to (0,1)
--connection master
# Configure master and slave with different values of the following variable:
set @@session.explicit_defaults_for_timestamp = 0;
--connection slave
# slave must produce the master version of the table definition and its data
set @@global.explicit_defaults_for_timestamp = 1;
--source suite/rpl/include/rpl_parallel_29322.inc
--echo # C. the bug case on the same version binlogs also to demo on the patch's base
--let $same_version_binlogs=1
# with more workers the bug shows more likeky on the patch's base slave.
--source include/stop_slave.inc
set @@global.slave_parallel_workers = 4;
--source include/start_slave.inc
--source suite/rpl/include/rpl_parallel_29322.inc
# cleanup
--connection master
set @@session.explicit_defaults_for_timestamp = @sav.explicit_defaults_for_timestamp;
--connection slave
set @@global.explicit_defaults_for_timestamp = @sav.explicit_defaults_for_timestamp;
--source include/stop_slave.inc
set @@global.slave_parallel_workers = @sav.slave_parallel_workers;
--source include/start_slave.inc
--source include/rpl_end.inc