Description:
A crash bug spotted while playing with log_bin configuration.
If give --log-bin a non-existed directory, mysqld will crash with signal SIGSEGV at start up, stack as bellow (with 8.0.13):
```
#0 0x00007f5c3ec2e97c in pthread_kill () from /lib64/libpthread.so.0
#1 0x00000000054398c3 in my_write_core (sig=11) at /Projects/mysql-server-8/mysys/stacktrace.cc:278
#2 0x0000000002f4bc03 in handle_fatal_signal (sig=11) at /Projects/mysql-server-8/sql/signal_handler.cc:249
#3 <signal handler called>
#4 0x00000000031a0334 in ER_THD (thd=0x0, mysql_errno=1098) at /Projects/mysql-server-8/sql/derror.cc:103
#5 0x0000000004c3a65d in MYSQL_BIN_LOG::generate_new_name (this=0xadf46a0 <mysql_bin_log>, new_name=0xadf46e0 <mysql_bin_log+64> "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin.1", log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:3380
#6 0x0000000004c3ac83 in MYSQL_BIN_LOG::init_and_set_log_file_name (this=0xadf46a0 <mysql_bin_log>, log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_name=0x0, new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:3420
#7 0x0000000004c438db in MYSQL_BIN_LOG::open_binlog (this=0xadf46a0 <mysql_bin_log>, log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_name=0x0, max_size_arg=1073741824, null_created_arg=false, need_lock_index=true, need_sid_lock=true, extra_description_event=0x0, new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:4521
#8 0x000000000291f9e6 in init_server_components () at /Projects/mysql-server-8/sql/mysqld.cc:5489
#9 0x000000000292658a in mysqld_main (argc=69, argv=0xbf90988) at /Projects/mysql-server-8/sql/mysqld.cc:6143
#10 0x00000000028fad29 in main (argc=8, argv=0x7fff5bf82b18) at /Projects/mysql-server-8/sql/main.cc:30
```
How to repeat:
testcase:
cat t/fungo.test
select 1;
with options:
cat t/fungo-master.opt
--log-bin=$MYSQLTEST_VARDIR/not_exsit_dir/mysql-bin --log_bin-index=master-log-bin.index
Suggested fix:
```
3375int MYSQL_BIN_LOG::generate_new_name(char *new_name, const char *log_name,
3376 uint32 new_index_number) {
3377 fn_format(new_name, log_name, mysql_data_home, "", 4);
3378 if (!fn_ext(log_name)[0]) {
3379 if (find_uniq_filename(new_name, new_index_number)) {
3380 my_printf_error(ER_NO_UNIQUE_LOGFILE,
3381 ER_THD(current_thd, ER_NO_UNIQUE_LOGFILE),
3382 MYF(ME_FATALERROR), log_name);
3383 LogErr(ERROR_LEVEL, ER_FAILED_TO_GENERATE_UNIQUE_LOGFILE, log_name);
3384 return 1;
3385 }
3386 }
3387 return 0;
3388}
```
In the initialization thread, current_thd is not set and invalid.
A simple fix could be change ER_THD to ER_DEFAULT
diff --git a/sql/binlog.cc b/sql/binlog.cc
index a3a6bf51a11..14b77663dfe 100644
--- a/sql/binlog.cc
+++ b/sql/binlog.cc
@@ -3378,7 +3378,7 @@ int MYSQL_BIN_LOG::generate_new_name(char *new_name, const char *log_name,
if (!fn_ext(log_name)[0]) {
if (find_uniq_filename(new_name, new_index_number)) {
my_printf_error(ER_NO_UNIQUE_LOGFILE,
- ER_THD(current_thd, ER_NO_UNIQUE_LOGFILE),
+ ER_DEFAULT(ER_NO_UNIQUE_LOGFILE),
MYF(ME_FATALERROR), log_name);
LogErr(ERROR_LEVEL, ER_FAILED_TO_GENERATE_UNIQUE_LOGFILE, log_name);
return 1;
Description: A crash bug spotted while playing with log_bin configuration. If give --log-bin a non-existed directory, mysqld will crash with signal SIGSEGV at start up, stack as bellow (with 8.0.13): ``` #0 0x00007f5c3ec2e97c in pthread_kill () from /lib64/libpthread.so.0 #1 0x00000000054398c3 in my_write_core (sig=11) at /Projects/mysql-server-8/mysys/stacktrace.cc:278 #2 0x0000000002f4bc03 in handle_fatal_signal (sig=11) at /Projects/mysql-server-8/sql/signal_handler.cc:249 #3 <signal handler called> #4 0x00000000031a0334 in ER_THD (thd=0x0, mysql_errno=1098) at /Projects/mysql-server-8/sql/derror.cc:103 #5 0x0000000004c3a65d in MYSQL_BIN_LOG::generate_new_name (this=0xadf46a0 <mysql_bin_log>, new_name=0xadf46e0 <mysql_bin_log+64> "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin.1", log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:3380 #6 0x0000000004c3ac83 in MYSQL_BIN_LOG::init_and_set_log_file_name (this=0xadf46a0 <mysql_bin_log>, log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_name=0x0, new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:3420 #7 0x0000000004c438db in MYSQL_BIN_LOG::open_binlog (this=0xadf46a0 <mysql_bin_log>, log_name=0xc0ccd30 "/Projects/mysql-server-8/mysql-test/var/not_exsit_dir/mysql-bin", new_name=0x0, max_size_arg=1073741824, null_created_arg=false, need_lock_index=true, need_sid_lock=true, extra_description_event=0x0, new_index_number=0) at /Projects/mysql-server-8/sql/binlog.cc:4521 #8 0x000000000291f9e6 in init_server_components () at /Projects/mysql-server-8/sql/mysqld.cc:5489 #9 0x000000000292658a in mysqld_main (argc=69, argv=0xbf90988) at /Projects/mysql-server-8/sql/mysqld.cc:6143 #10 0x00000000028fad29 in main (argc=8, argv=0x7fff5bf82b18) at /Projects/mysql-server-8/sql/main.cc:30 ``` How to repeat: testcase: cat t/fungo.test select 1; with options: cat t/fungo-master.opt --log-bin=$MYSQLTEST_VARDIR/not_exsit_dir/mysql-bin --log_bin-index=master-log-bin.index Suggested fix: ``` 3375int MYSQL_BIN_LOG::generate_new_name(char *new_name, const char *log_name, 3376 uint32 new_index_number) { 3377 fn_format(new_name, log_name, mysql_data_home, "", 4); 3378 if (!fn_ext(log_name)[0]) { 3379 if (find_uniq_filename(new_name, new_index_number)) { 3380 my_printf_error(ER_NO_UNIQUE_LOGFILE, 3381 ER_THD(current_thd, ER_NO_UNIQUE_LOGFILE), 3382 MYF(ME_FATALERROR), log_name); 3383 LogErr(ERROR_LEVEL, ER_FAILED_TO_GENERATE_UNIQUE_LOGFILE, log_name); 3384 return 1; 3385 } 3386 } 3387 return 0; 3388} ``` In the initialization thread, current_thd is not set and invalid. A simple fix could be change ER_THD to ER_DEFAULT diff --git a/sql/binlog.cc b/sql/binlog.cc index a3a6bf51a11..14b77663dfe 100644 --- a/sql/binlog.cc +++ b/sql/binlog.cc @@ -3378,7 +3378,7 @@ int MYSQL_BIN_LOG::generate_new_name(char *new_name, const char *log_name, if (!fn_ext(log_name)[0]) { if (find_uniq_filename(new_name, new_index_number)) { my_printf_error(ER_NO_UNIQUE_LOGFILE, - ER_THD(current_thd, ER_NO_UNIQUE_LOGFILE), + ER_DEFAULT(ER_NO_UNIQUE_LOGFILE), MYF(ME_FATALERROR), log_name); LogErr(ERROR_LEVEL, ER_FAILED_TO_GENERATE_UNIQUE_LOGFILE, log_name); return 1;