Commit f0f43181 authored by Mats Kindahl's avatar Mats Kindahl

Bug #58455

Starting mysqld with defaults file without
extension cause segmentation fault

Bug occurs because fn_expand calls fn_format
with NULL as ext.

This is a backport of the patch from 5.6.

Patch solve this problem by using an empty
string as extension, and adding assertions
to fn_format that correct arguments are passed.

It also add a test tests several variations of
using non-existing defaults files.
parent cce4b730
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
# 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;
...@@ -179,7 +179,7 @@ fn_expand(const char *filename, char *result_buf) ...@@ -179,7 +179,7 @@ fn_expand(const char *filename, char *result_buf)
if (my_getwd(dir, sizeof(dir), MYF(0))) if (my_getwd(dir, sizeof(dir), MYF(0)))
DBUG_RETURN(3); DBUG_RETURN(3);
DBUG_PRINT("debug", ("dir: %s", dir)); 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_RETURN(2);
DBUG_PRINT("return", ("result: %s", result_buf)); DBUG_PRINT("return", ("result: %s", result_buf));
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -31,6 +31,8 @@ char * fn_format(char * to, const char *name, const char *dir, ...@@ -31,6 +31,8 @@ char * fn_format(char * to, const char *name, const char *dir,
reg1 size_t length; reg1 size_t length;
size_t dev_length; size_t dev_length;
DBUG_ENTER("fn_format"); DBUG_ENTER("fn_format");
DBUG_ASSERT(name != NULL);
DBUG_ASSERT(extension != NULL);
DBUG_PRINT("enter",("name: %s dir: %s extension: %s flag: %d", DBUG_PRINT("enter",("name: %s dir: %s extension: %s flag: %d",
name,dir,extension,flag)); name,dir,extension,flag));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment