← Back to team overview

maria-developers team mailing list archive

2f859962b03: MDEV-23534: SIGSEGV in sf_malloc_usable_size/my_free on SET GLOBAL REPLICATE_DO_TABLE

 

revision-id: 2f859962b032cc75176e05df8d704eec413cdb17 (mariadb-10.1.43-266-g2f859962b03)
parent(s): 62d1e3bf67a12eb6f48ac615bda119e2ed65cf16
author: Sujatha
committer: Sujatha
timestamp: 2020-08-26 16:25:28 +0530
message:

MDEV-23534: SIGSEGV in sf_malloc_usable_size/my_free on SET GLOBAL REPLICATE_DO_TABLE

Backporting fixes for:

MDEV-22317: SIGSEGV in my_free/delete_dynamic in optimized builds (ARIA)
MDEV-22059: MSAN report at replicate_ignore_table_grant

---
 .../suite/rpl/r/rpl_filter_tables_dynamic.result   |  2 +
 .../rpl/r/rpl_filter_wild_tables_dynamic.result    |  2 +
 .../suite/rpl/t/rpl_filter_tables_dynamic.test     |  2 +
 .../rpl/t/rpl_filter_wild_tables_dynamic.test      |  2 +
 sql/rpl_filter.cc                                  | 52 ++++++++++++++++------
 5 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/mysql-test/suite/rpl/r/rpl_filter_tables_dynamic.result b/mysql-test/suite/rpl/r/rpl_filter_tables_dynamic.result
index 5a746c88458..9709e24fbde 100644
--- a/mysql-test/suite/rpl/r/rpl_filter_tables_dynamic.result
+++ b/mysql-test/suite/rpl/r/rpl_filter_tables_dynamic.result
@@ -5,6 +5,8 @@ ERROR HY000: This operation cannot be performed as you have a running slave '';
 SET @@GLOBAL.replicate_ignore_table="test.t4,test.t5,test.t6";
 ERROR HY000: This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first
 include/stop_slave.inc
+SET @@GLOBAL.replicate_do_table="";
+SET @@GLOBAL.replicate_ignore_table="";
 SET @@GLOBAL.replicate_do_table="test.t1,test.t2,test.t3";
 SET @@GLOBAL.replicate_ignore_table="test.t4,test.t5,test.t6";
 include/start_slave.inc
diff --git a/mysql-test/suite/rpl/r/rpl_filter_wild_tables_dynamic.result b/mysql-test/suite/rpl/r/rpl_filter_wild_tables_dynamic.result
index 19d8e513e6f..338f4b3bbcf 100644
--- a/mysql-test/suite/rpl/r/rpl_filter_wild_tables_dynamic.result
+++ b/mysql-test/suite/rpl/r/rpl_filter_wild_tables_dynamic.result
@@ -5,6 +5,8 @@ ERROR HY000: This operation cannot be performed as you have a running slave '';
 SET @@GLOBAL.replicate_wild_ignore_table="test.b%";
 ERROR HY000: This operation cannot be performed as you have a running slave ''; run STOP SLAVE '' first
 include/stop_slave.inc
+SET @@GLOBAL.replicate_wild_do_table="";
+SET @@GLOBAL.replicate_wild_ignore_table="";
 SET @@GLOBAL.replicate_wild_do_table="test.a%";
 SET @@GLOBAL.replicate_wild_ignore_table="test.b%";
 include/start_slave.inc
diff --git a/mysql-test/suite/rpl/t/rpl_filter_tables_dynamic.test b/mysql-test/suite/rpl/t/rpl_filter_tables_dynamic.test
index 97ecc167356..ebededc36b3 100644
--- a/mysql-test/suite/rpl/t/rpl_filter_tables_dynamic.test
+++ b/mysql-test/suite/rpl/t/rpl_filter_tables_dynamic.test
@@ -51,6 +51,8 @@ SET @@GLOBAL.replicate_ignore_table="test.t4,test.t5,test.t6";
 
 connection slave;
 source include/stop_slave.inc;
+SET @@GLOBAL.replicate_do_table="";
+SET @@GLOBAL.replicate_ignore_table="";
 SET @@GLOBAL.replicate_do_table="test.t1,test.t2,test.t3";
 SET @@GLOBAL.replicate_ignore_table="test.t4,test.t5,test.t6";
 source include/start_slave.inc;
diff --git a/mysql-test/suite/rpl/t/rpl_filter_wild_tables_dynamic.test b/mysql-test/suite/rpl/t/rpl_filter_wild_tables_dynamic.test
index c822c81f270..09db91aa4d3 100644
--- a/mysql-test/suite/rpl/t/rpl_filter_wild_tables_dynamic.test
+++ b/mysql-test/suite/rpl/t/rpl_filter_wild_tables_dynamic.test
@@ -13,6 +13,8 @@ SET @@GLOBAL.replicate_wild_ignore_table="test.b%";
 
 connection slave;
 source include/stop_slave.inc;
+SET @@GLOBAL.replicate_wild_do_table="";
+SET @@GLOBAL.replicate_wild_ignore_table="";
 SET @@GLOBAL.replicate_wild_do_table="test.a%";
 SET @@GLOBAL.replicate_wild_ignore_table="test.b%";
 source include/start_slave.inc;
diff --git a/sql/rpl_filter.cc b/sql/rpl_filter.cc
index 366902c1f26..0d5d9ffeea8 100644
--- a/sql/rpl_filter.cc
+++ b/sql/rpl_filter.cc
@@ -349,14 +349,20 @@ Rpl_filter::set_do_table(const char* table_spec)
   int status;
 
   if (do_table_inited)
-    my_hash_reset(&do_table);
+  {
+    my_hash_free(&do_table);
+    do_table_inited= 0;
+  }
 
   status= parse_filter_rule(table_spec, &Rpl_filter::add_do_table);
 
-  if (!do_table.records)
+  if (do_table_inited && status)
   {
-    my_hash_free(&do_table);
-    do_table_inited= 0;
+    if (!do_table.records)
+    {
+      my_hash_free(&do_table);
+      do_table_inited= 0;
+    }
   }
 
   return status;
@@ -369,14 +375,20 @@ Rpl_filter::set_ignore_table(const char* table_spec)
   int status;
 
   if (ignore_table_inited)
-    my_hash_reset(&ignore_table);
+  {
+    my_hash_free(&ignore_table);
+    ignore_table_inited= 0;
+  }
 
   status= parse_filter_rule(table_spec, &Rpl_filter::add_ignore_table);
 
-  if (!ignore_table.records)
+  if (ignore_table_inited && status)
   {
-    my_hash_free(&ignore_table);
-    ignore_table_inited= 0;
+    if (!ignore_table.records)
+    {
+      my_hash_free(&ignore_table);
+      ignore_table_inited= 0;
+    }
   }
 
   return status;
@@ -411,14 +423,20 @@ Rpl_filter::set_wild_do_table(const char* table_spec)
   int status;
 
   if (wild_do_table_inited)
+  {
     free_string_array(&wild_do_table);
+    wild_do_table_inited= 0;
+  }
 
   status= parse_filter_rule(table_spec, &Rpl_filter::add_wild_do_table);
 
-  if (!wild_do_table.elements)
+  if (wild_do_table_inited && status)
   {
-    delete_dynamic(&wild_do_table);
-    wild_do_table_inited= 0;
+    if (!wild_do_table.elements)
+    {
+      delete_dynamic(&wild_do_table);
+      wild_do_table_inited= 0;
+    }
   }
 
   return status;
@@ -431,14 +449,20 @@ Rpl_filter::set_wild_ignore_table(const char* table_spec)
   int status;
 
   if (wild_ignore_table_inited)
+  {
     free_string_array(&wild_ignore_table);
+    wild_ignore_table_inited= 0;
+  }
 
   status= parse_filter_rule(table_spec, &Rpl_filter::add_wild_ignore_table);
 
-  if (!wild_ignore_table.elements)
+  if (wild_ignore_table_inited && status)
   {
-    delete_dynamic(&wild_ignore_table);
-    wild_ignore_table_inited= 0;
+    if (!wild_ignore_table.elements)
+    {
+      delete_dynamic(&wild_ignore_table);
+      wild_ignore_table_inited= 0;
+    }
   }
 
   return status;