mirror of
https://github.com/MariaDB/server.git
synced 2025-08-23 03:54:27 +03:00
Analysis: At check_trx_exists function InnoDB allocates a new trx if no trx is found from thd but this newly allocated trx is not registered to thd. This is unsafe, because nothing prevents InnoDB plugin from being uninstalled while there's active transaction. This can cause crashes, hang and any other odd behavior. It may also corrupt stack, as functions pointers are not available after dlclose. Fix: The fix is to use thd_set_ha_data() when manipulating per-connection handler data. It does appropriate plugin locking.
59 lines
986 B
Plaintext
59 lines
986 B
Plaintext
--source include/not_embedded.inc
|
|
--source include/not_windows.inc
|
|
|
|
if (!$HA_INNODB_SO) {
|
|
--skip Need InnoDB plugin
|
|
}
|
|
|
|
#
|
|
# MDEV-8474: InnoDB sets per-connection data unsafely
|
|
# Below test caused hang
|
|
#
|
|
install plugin innodb soname 'ha_innodb';
|
|
create table t1(a int not null primary key) engine=innodb;
|
|
|
|
connect (con1, localhost, root);
|
|
connection con1;
|
|
begin;
|
|
insert into t1 values(1);
|
|
|
|
connection default;
|
|
flush tables;
|
|
send uninstall plugin innodb;
|
|
|
|
connection con1;
|
|
select sleep(1);
|
|
disconnect con1;
|
|
|
|
connection default;
|
|
reap;
|
|
|
|
--source include/restart_mysqld.inc
|
|
|
|
drop table t1;
|
|
|
|
#
|
|
# Another test that caused hang.
|
|
#
|
|
|
|
connect (con1, localhost, root);
|
|
connection con1;
|
|
install plugin innodb soname 'ha_innodb';
|
|
create table t2(a int not null primary key) engine=innodb;
|
|
insert into t2 values(1);
|
|
drop table t2;
|
|
|
|
connection default;
|
|
send uninstall plugin innodb;
|
|
|
|
connection con1;
|
|
select sleep(1);
|
|
disconnect con1;
|
|
|
|
connection default;
|
|
reap;
|
|
|
|
--source include/restart_mysqld.inc
|
|
|
|
|