diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2016-06-16 12:35:14 +0400 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2016-06-16 12:35:14 +0400 |
commit | 0e50b924820d365bcc1659eec2cad606f6887597 (patch) | |
tree | ce47e88b6ccc9e94e0a08b01f35bdf8c5dd5aebb | |
parent | 732e2694058788c14b55db052dedc102ac21d1bc (diff) | |
download | mariadb-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.result | 1 | ||||
-rw-r--r-- | mysql-test/t/mysqld_option_err.test | 8 | ||||
-rw-r--r-- | sql/sql_show.cc | 24 |
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; |