diff --git a/mysql-test/main/bad_startup_options_debug.result b/mysql-test/main/bad_startup_options_debug.result new file mode 100644 index 00000000000..626d9337d2b --- /dev/null +++ b/mysql-test/main/bad_startup_options_debug.result @@ -0,0 +1,7 @@ +# +# MDEV-34437 SIGSEGV in vio_get_normalized_ip when using extra-port +# +FOUND 1 /\[ERROR\] Can't create IP socket: Servname not supported/ in errorlog.err +FOUND 1 /\[ERROR\] Can't create IP socket: Servname not supported/ in errorlog.err +# restart +# End of 10.11 tests diff --git a/mysql-test/main/bad_startup_options_debug.test b/mysql-test/main/bad_startup_options_debug.test new file mode 100644 index 00000000000..c43124eba39 --- /dev/null +++ b/mysql-test/main/bad_startup_options_debug.test @@ -0,0 +1,34 @@ +# mysqld refuses to run as root normally. +--source include/not_as_root.inc +--source include/have_debug.inc +--source include/not_embedded.inc +--source include/linux.inc + +--source include/shutdown_mysqld.inc + +# Try to start the server, with bad values for some options. +# Make sure, the starts fails, and expected message is in the error log + +--let errorlog=$MYSQL_TMP_DIR/errorlog.err +--let SEARCH_FILE=$errorlog + +--echo # +--echo # MDEV-34437 SIGSEGV in vio_get_normalized_ip when using extra-port +--echo # + +# getaddrinfo failure by fixing port to invalid value +--error 1 +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --debug='d,sabotage_port_number' --log-error=$errorlog +--let SEARCH_PATTERN=\[ERROR\] Can't create IP socket: Servname not supported +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +--error 1 +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --debug='d,sabotage_port_number' --bind-address=0.0.0.0 --log-error=$errorlog +--let SEARCH_PATTERN=\[ERROR\] Can't create IP socket: Servname not supported +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +--source include/start_mysqld.inc + +--echo # End of 10.11 tests diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 890fe8cf87e..d1d32fc77fe 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2329,6 +2329,7 @@ static void activate_tcp_port(uint port, else real_bind_addr_str= my_bind_addr_str; + DBUG_EXECUTE_IF("sabotage_port_number", port= UINT_MAX32;); my_snprintf(port_buf, NI_MAXSERV, "%d", port); if (real_bind_addr_str && *real_bind_addr_str) @@ -2372,6 +2373,13 @@ static void activate_tcp_port(uint port, else { error= getaddrinfo(real_bind_addr_str, port_buf, &hints, &ai); + if (unlikely(error != 0)) + { + sql_print_error("%s: %s", ER_DEFAULT(ER_IPSOCK_ERROR), + gai_strerror(error)); + unireg_abort(1); /* purecov: tested */ + } + head= ai; }