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) ...@@ -513,44 +513,46 @@ bool MYSQL_LOG::is_active(const char* log_file_name)
void MYSQL_LOG::new_file(bool inside_mutex) void MYSQL_LOG::new_file(bool inside_mutex)
{ {
if (!is_open())
return;
if (!inside_mutex) if (!inside_mutex)
VOID(pthread_mutex_lock(&LOCK_log)); 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 We log the whole file name for log file as the user may decide
(binlog with constant name are non-rotatable) to change base names at some point.
*/ */
if (generate_new_name(new_name, name)) Rotate_log_event r(new_name+dirname_length(new_name));
{ r.write(&log_file);
if (!inside_mutex) VOID(pthread_cond_broadcast(&COND_binlog_update));
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));
}
} }
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) if (!inside_mutex)
VOID(pthread_mutex_unlock(&LOCK_log)); VOID(pthread_mutex_unlock(&LOCK_log));
} }
...@@ -564,8 +566,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, ...@@ -564,8 +566,8 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command,
int error=0; int error=0;
VOID(pthread_mutex_lock(&LOCK_log)); VOID(pthread_mutex_lock(&LOCK_log));
/* Test if someone closed after the is_open test */ /* Test if someone closed between the is_open test and lock */
if (log_type != LOG_CLOSED) if (is_open())
{ {
time_t skr; time_t skr;
ulong id; 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