Commit 0f6915e1 authored by unknown's avatar unknown

Fix bug #31604: server crash when setting slow_query_log_file/global general_log_file variable

Problem: we don't evaluate given expression checking values of the
slow_query_log_file/general_log_file, don't check it for NULL.

Fix: evaluate the expression, check result returned.


mysql-test/r/log_state.result:
  Fix bug #31604: server crash when setting slow_query_log_file/global general_log_file variable
    - test result.
mysql-test/t/log_state.test:
  Fix bug #31604: server crash when setting slow_query_log_file/global general_log_file variable
    - test case.
sql/set_var.cc:
  Fix bug #31604: server crash when setting slow_query_log_file/global general_log_file variable
    - evaluate var->value calling val_str() method;
    - check for null values returned;
    - return proper errors if any.
parent c51fa634
...@@ -175,3 +175,16 @@ SET GLOBAL slow_query_log = ON; ...@@ -175,3 +175,16 @@ SET GLOBAL slow_query_log = ON;
SET GLOBAL READ_ONLY = OFF; SET GLOBAL READ_ONLY = OFF;
SET GLOBAL general_log = @old_general_log_state; SET GLOBAL general_log = @old_general_log_state;
SET GLOBAL slow_query_log = @old_slow_log_state; SET GLOBAL slow_query_log = @old_slow_log_state;
set @old_general_log_file= @@global.general_log_file;
set @old_slow_query_log_file= @@global.slow_query_log_file;
set global general_log_file= concat('/not exiting path/log.maste', 'r');
ERROR 42000: Variable 'general_log_file' can't be set to the value of '/not exiting path/log.master'
set global general_log_file= NULL;
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'NULL'
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r');
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of '/not exiting path/log.master'
set global slow_query_log_file= NULL;
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'NULL'
set global general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file;
End of 5.1 tests
...@@ -189,3 +189,23 @@ disconnect con1; ...@@ -189,3 +189,23 @@ disconnect con1;
# Remove the log files that was created in the "default location" # Remove the log files that was created in the "default location"
# i.e var/run # i.e var/run
--remove_file $MYSQLTEST_VARDIR/run/master.log --remove_file $MYSQLTEST_VARDIR/run/master.log
#
# Bug #31604: server crash when setting slow_query_log_file/general_log_file
#
set @old_general_log_file= @@global.general_log_file;
set @old_slow_query_log_file= @@global.slow_query_log_file;
--error 1231
set global general_log_file= concat('/not exiting path/log.maste', 'r');
--error 1231
set global general_log_file= NULL;
--error 1231
set global slow_query_log_file= concat('/not exiting path/log.maste', 'r');
--error 1231
set global slow_query_log_file= NULL;
set global general_log_file= @old_general_log_file;
set global slow_query_log_file= @old_slow_query_log_file;
--echo End of 5.1 tests
...@@ -2102,18 +2102,24 @@ void sys_var_log_state::set_default(THD *thd, enum_var_type type) ...@@ -2102,18 +2102,24 @@ void sys_var_log_state::set_default(THD *thd, enum_var_type type)
static int sys_check_log_path(THD *thd, set_var *var) static int sys_check_log_path(THD *thd, set_var *var)
{ {
char path[FN_REFLEN]; char path[FN_REFLEN], buff[FN_REFLEN];
MY_STAT f_stat; MY_STAT f_stat;
const char *var_path= var->value->str_value.ptr(); String str(buff, sizeof(buff), system_charset_info), *res;
const char *log_file_str;
if (!(res= var->value->val_str(&str)))
goto err;
log_file_str= res->c_ptr();
bzero(&f_stat, sizeof(MY_STAT)); bzero(&f_stat, sizeof(MY_STAT));
(void) unpack_filename(path, var_path); (void) unpack_filename(path, log_file_str);
if (my_stat(path, &f_stat, MYF(0))) if (my_stat(path, &f_stat, MYF(0)))
{ {
/* Check if argument is a file and we have 'write' permission */ /* Check if argument is a file and we have 'write' permission */
if (!MY_S_ISREG(f_stat.st_mode) || if (!MY_S_ISREG(f_stat.st_mode) ||
!(f_stat.st_mode & MY_S_IWRITE)) !(f_stat.st_mode & MY_S_IWRITE))
return -1; goto err;
} }
else else
{ {
...@@ -2122,11 +2128,16 @@ static int sys_check_log_path(THD *thd, set_var *var) ...@@ -2122,11 +2128,16 @@ static int sys_check_log_path(THD *thd, set_var *var)
Check if directory exists and Check if directory exists and
we have permission to create file & write to file we have permission to create file & write to file
*/ */
(void) dirname_part(path, var_path, &path_length); (void) dirname_part(path, log_file_str, &path_length);
if (my_access(path, (F_OK|W_OK))) if (my_access(path, (F_OK|W_OK)))
return -1; goto err;
} }
return 0; return 0;
err:
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name,
res ? log_file_str : "NULL");
return 1;
} }
......
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