From 243dee741542dee949fdeb027b8a7d10fdee95c3 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 24 Jun 2024 09:17:26 +1000 Subject: [PATCH] MDEV-34437: handle error on getaddrinfo When getaddrinfo returns and error, the contents of ai are invalid so we cannot continue based on their data structures. In the previous branch of the if statement, we abort there if there is an error so for consistency we abort here too. The test case fixes the port number to UINTMAX32 for both an enumberated bind-address and the default bind-address covering the two calls to getaddrinfo. Review thanks Sanja. --- .../main/bad_startup_options_debug.result | 7 ++++ .../main/bad_startup_options_debug.test | 34 +++++++++++++++++++ sql/mysqld.cc | 8 +++++ 3 files changed, 49 insertions(+) create mode 100644 mysql-test/main/bad_startup_options_debug.result create mode 100644 mysql-test/main/bad_startup_options_debug.test 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; }