summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2016-06-16 12:35:14 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2016-06-16 12:35:14 +0400
commit0e50b924820d365bcc1659eec2cad606f6887597 (patch)
treece47e88b6ccc9e94e0a08b01f35bdf8c5dd5aebb
parent732e2694058788c14b55db052dedc102ac21d1bc (diff)
downloadmariadb-git-0e50b924820d365bcc1659eec2cad606f6887597.tar.gz
MDEV-9969 mysql_install_db error processing ignore_db_dirs.
Check for same directories in the list added.
-rw-r--r--mysql-test/r/mysqld_option_err.result1
-rw-r--r--mysql-test/t/mysqld_option_err.test8
-rw-r--r--sql/sql_show.cc24
3 files changed, 30 insertions, 3 deletions
diff --git a/mysql-test/r/mysqld_option_err.result b/mysql-test/r/mysqld_option_err.result
index 4afcc5e0cb1..1870ea85270 100644
--- a/mysql-test/r/mysqld_option_err.result
+++ b/mysql-test/r/mysqld_option_err.result
@@ -5,4 +5,5 @@ Test non-numeric value passed to number option.
Test that bad value for plugin enum option is rejected correctly.
Test that --help --verbose works
Test that --not-known-option --help --verbose gives error
+Test that specifying same directory several times handled properly.
Done.
diff --git a/mysql-test/t/mysqld_option_err.test b/mysql-test/t/mysqld_option_err.test
index 0c38eba7ca9..6f1e089fbe4 100644
--- a/mysql-test/t/mysqld_option_err.test
+++ b/mysql-test/t/mysqld_option_err.test
@@ -56,4 +56,12 @@ mkdir $MYSQLTEST_VARDIR/tmp/mysqld_option_err;
--error 2
--exec $MYSQLD_BOOTSTRAP_CMD --not-known-option --help --verbose >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1
+#
+# MDEV-9969 mysql_install_db error processing ignore_db_dirs.
+#
+
+--echo Test that specifying same directory several times handled properly.
+
+--exec echo "" | $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1
+
--echo Done.
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index b8926b986b0..931011dcbc2 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -720,12 +720,24 @@ ignore_db_dirs_process_additions()
for (i= 0; i < ignore_db_dirs_array.elements; i++)
{
get_dynamic(&ignore_db_dirs_array, (uchar *) &dir, i);
- if (my_hash_insert(&ignore_db_dirs_hash, (uchar *) dir))
+ if (my_hash_insert(&ignore_db_dirs_hash, (uchar *)dir))
+ {
+ /* ignore duplicates from the config file */
+ if (my_hash_search(&ignore_db_dirs_hash, (uchar *)dir->str, dir->length))
+ {
+ sql_print_warning("Duplicate ignore-db-dir directory name '%.*s' "
+ "found in the config file(s). Ignoring the duplicate.",
+ (int) dir->length, dir->str);
+ my_free(dir);
+ goto continue_loop;
+ }
+
return true;
+ }
ptr= strnmov(ptr, dir->str, dir->length);
- if (i + 1 < ignore_db_dirs_array.elements)
- ptr= strmov(ptr, ",");
+ *(ptr++)= ',';
+continue_loop:
/*
Set the transferred array element to NULL to avoid double free
in case of error.
@@ -734,6 +746,12 @@ ignore_db_dirs_process_additions()
set_dynamic(&ignore_db_dirs_array, (uchar *) &dir, i);
}
+ if (ptr > opt_ignore_db_dirs)
+ {
+ ptr--;
+ DBUG_ASSERT(*ptr == ',');
+ }
+
/* make sure the string is terminated */
DBUG_ASSERT(ptr - opt_ignore_db_dirs <= (ptrdiff_t) len);
*ptr= 0;