diff --git a/mysql-test/r/mysqld--defaults-file.result b/mysql-test/r/mysqld--defaults-file.result new file mode 100644 index 00000000000..5fd5ca8d95a --- /dev/null +++ b/mysql-test/r/mysqld--defaults-file.result @@ -0,0 +1,12 @@ +Could not open required defaults file: /path/with/no/extension +Fatal error in defaults handling. Program aborted +Could not open required defaults file: /path/with.ext +Fatal error in defaults handling. Program aborted +Could not open required defaults file: MYSQL_TEST_DIR/relative/path/with.ext +Fatal error in defaults handling. Program aborted +Could not open required defaults file: MYSQL_TEST_DIR/relative/path/without/extension +Fatal error in defaults handling. Program aborted +Could not open required defaults file: MYSQL_TEST_DIR/with.ext +Fatal error in defaults handling. Program aborted +Could not open required defaults file: MYSQL_TEST_DIR/no_extension +Fatal error in defaults handling. Program aborted diff --git a/mysql-test/t/mysqld--defaults-file.test b/mysql-test/t/mysqld--defaults-file.test new file mode 100644 index 00000000000..065436c38aa --- /dev/null +++ b/mysql-test/t/mysqld--defaults-file.test @@ -0,0 +1,47 @@ +# BUG#58455 +# Starting mysqld with defaults file without extension cause +# segmentation fault + +source include/not_embedded.inc; +source include/not_windows.inc; + +# We need to use a plain "mysqld" without any other options to trigger +# the bug. In particular, it seems that passing --bootstrap does not +# trigger the bug. To do that, we extract the "command name" from the +# MYSQLD_BOOTSTRAP_CMD variable and store that in a file, which we +# then load into the test case. + +perl; + my ($mysqld)= split " ", $ENV{MYSQLD_BOOTSTRAP_CMD}; + open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/mysqld.inc") or die; + print FILE "let \$MYSQLD= $mysqld;\n"; + close FILE; +EOF + +source $MYSQL_TMP_DIR/mysqld.inc; + +# All these tests refer to configuration files that do not exist + +--error 1 +exec $MYSQLD --defaults-file=/path/with/no/extension --print-defaults 2>&1; + +--error 1 +exec $MYSQLD --defaults-file=/path/with.ext --print-defaults 2>&1; + +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--error 1 +exec $MYSQLD --defaults-file=relative/path/with.ext --print-defaults 2>&1; + +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--error 1 +exec $MYSQLD --defaults-file=relative/path/without/extension --print-defaults 2>&1; + +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--error 1 +exec $MYSQLD --defaults-file=with.ext --print-defaults 2>&1; + +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +--error 1 +exec $MYSQLD --defaults-file=no_extension --print-defaults 2>&1; + +remove_file $MYSQL_TMP_DIR/mysqld.inc; diff --git a/mysys/default.c b/mysys/default.c index 432c3086254..9a4b990f003 100644 --- a/mysys/default.c +++ b/mysys/default.c @@ -179,7 +179,7 @@ fn_expand(const char *filename, char *result_buf) if (my_getwd(dir, sizeof(dir), MYF(0))) DBUG_RETURN(3); DBUG_PRINT("debug", ("dir: %s", dir)); - if (fn_format(result_buf, filename, dir, NULL, flags) == NULL) + if (fn_format(result_buf, filename, dir, "", flags) == NULL) DBUG_RETURN(2); DBUG_PRINT("return", ("result: %s", result_buf)); DBUG_RETURN(0); diff --git a/mysys/mf_format.c b/mysys/mf_format.c index 6afa2938fa3..74f114a966f 100644 --- a/mysys/mf_format.c +++ b/mysys/mf_format.c @@ -31,6 +31,8 @@ char * fn_format(char * to, const char *name, const char *dir, reg1 size_t length; size_t dev_length; DBUG_ENTER("fn_format"); + DBUG_ASSERT(name != NULL); + DBUG_ASSERT(extension != NULL); DBUG_PRINT("enter",("name: %s dir: %s extension: %s flag: %d", name,dir,extension,flag));