From 23e090626a9138f44905a5a8e681e8952f98aac7 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Sat, 24 Apr 2021 09:06:16 +0300 Subject: [PATCH] MDEV-20842 Crash using versioning plugin functions after plugin was removed from server Remove plugin functions via item_create_remove() at deinit time. --- mysql-test/suite/versioning/r/trx_id.result | 6 ++++++ mysql-test/suite/versioning/t/trx_id.test | 8 +++++++- plugin/versioning/versioning.cc | 1 + sql/item_create.cc | 15 +++++++++++++++ sql/item_create.h | 1 + 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/versioning/r/trx_id.result b/mysql-test/suite/versioning/r/trx_id.result index 58d02505fb6..ea06a2e545d 100644 --- a/mysql-test/suite/versioning/r/trx_id.result +++ b/mysql-test/suite/versioning/r/trx_id.result @@ -506,3 +506,9 @@ add period for system_time(`row_start`,`row_end`), modify x int after row_start, with system versioning; create or replace database test; +# +# MDEV-20842 Crash using versioning plugin functions after plugin was removed from server +# +uninstall plugin test_versioning; +select trt_begin_ts(0); +ERROR 42000: FUNCTION trt_begin_ts does not exist diff --git a/mysql-test/suite/versioning/t/trx_id.test b/mysql-test/suite/versioning/t/trx_id.test index 7dfc8acb080..b68d5513dd9 100644 --- a/mysql-test/suite/versioning/t/trx_id.test +++ b/mysql-test/suite/versioning/t/trx_id.test @@ -529,5 +529,11 @@ alter table t add `row_start` bigint unsigned as row start, modify x int after row_start, with system versioning; - create or replace database test; + +--echo # +--echo # MDEV-20842 Crash using versioning plugin functions after plugin was removed from server +--echo # +uninstall plugin test_versioning; +--error ER_SP_DOES_NOT_EXIST +select trt_begin_ts(0); diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index 7e3c29e1494..56f8f1f5a1d 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -175,6 +175,7 @@ static int versioning_plugin_init(void *p __attribute__ ((unused))) static int versioning_plugin_deinit(void *p __attribute__ ((unused))) { DBUG_ENTER("versioning_plugin_deinit"); + (void) item_create_remove(func_array); DBUG_RETURN(0); } diff --git a/sql/item_create.cc b/sql/item_create.cc index 48e396210a5..70ac2abe959 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -7465,6 +7465,21 @@ int item_create_append(Native_func_registry array[]) DBUG_RETURN(0); } +int item_create_remove(Native_func_registry array[]) +{ + Native_func_registry *func; + + DBUG_ENTER("item_create_remove"); + + for (func= array; func->builder != NULL; func++) + { + if (my_hash_delete(& native_functions_hash, (uchar*) func)) + DBUG_RETURN(1); + } + + DBUG_RETURN(0); +} + /* Empty the hash table for native functions. Note: this code is not thread safe, and is intended to be used at server diff --git a/sql/item_create.h b/sql/item_create.h index b9d5ab9f377..7e92016ab96 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -214,6 +214,7 @@ struct Native_func_registry int item_create_init(); int item_create_append(Native_func_registry array[]); +int item_create_remove(Native_func_registry array[]); void item_create_cleanup(); Item *create_func_dyncol_create(THD *thd, List &list);