Commit a1517908 authored by unknown's avatar unknown

touchup to last fix


sql/log.cc:
  moved mutex back to after is_open() test,
  but still protecting name dereference (the real problem)
parent 2ab04c8c
......@@ -513,44 +513,46 @@ bool MYSQL_LOG::is_active(const char* log_file_name)
void MYSQL_LOG::new_file(bool inside_mutex)
{
if (!is_open())
return;
if (!inside_mutex)
VOID(pthread_mutex_lock(&LOCK_log));
if (is_open())
{
char new_name[FN_REFLEN], *old_name=name;
char new_name[FN_REFLEN], *old_name = name;
if (!no_rotate)
if (!no_rotate)
{
/*
only rotate open logs that are marked non-rotatable
(binlog with constant name are non-rotatable)
*/
if (generate_new_name(new_name, name))
{
if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log));
return; // Something went wrong
}
if (log_type == LOG_BIN)
{
/*
only rotate open logs that are marked non-rotatable
(binlog with constant name are non-rotatable)
We log the whole file name for log file as the user may decide
to change base names at some point.
*/
if (generate_new_name(new_name, name))
{
if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log));
return; // Something went wrong
}
if (log_type == LOG_BIN)
{
/*
We log the whole file name for log file as the user may decide
to change base names at some point.
*/
Rotate_log_event r(new_name+dirname_length(new_name));
r.write(&log_file);
VOID(pthread_cond_broadcast(&COND_binlog_update));
}
Rotate_log_event r(new_name+dirname_length(new_name));
r.write(&log_file);
VOID(pthread_cond_broadcast(&COND_binlog_update));
}
else
strmov(new_name, old_name); // Reopen old file name
name=0;
close();
open(old_name, log_type, new_name);
my_free(old_name,MYF(0));
last_time=query_start=0;
write_error=0;
}
else
strmov(new_name, old_name); // Reopen old file name
name=0;
close();
open(old_name, log_type, new_name);
my_free(old_name,MYF(0));
last_time=query_start=0;
write_error=0;
if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log));
}
......@@ -564,8 +566,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command,
int error=0;
VOID(pthread_mutex_lock(&LOCK_log));
/* Test if someone closed after the is_open test */
if (log_type != LOG_CLOSED)
/* Test if someone closed between the is_open test and lock */
if (is_open())
{
time_t skr;
ulong id;
......
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