From da877f64fe83b0abf36607fe763e4db56c5556bb Mon Sep 17 00:00:00 2001
From: Kristofer Pettersson <kristofer.pettersson@sun.com>
Date: Wed, 13 Jan 2010 12:39:00 +0100
Subject: [PATCH] Bug#33982 debug assertion and crash reloading grant tables
 after sighup or kill

In certain rare cases when a process was interrupted
during a FLUSH PRIVILEGES operation the diagnostic
area would be set to an error state but the function
responsible for the operation would still signal
success. This would lead to a debug assertion error
later on when the server would attempt to reset the
DA before sending the error message.

This patch fixes the issue by assuring that
reload_acl_and_cache() always fails if an error
condition is raised.

The second issue was that a KILL could cause
a console error message which referred to a DA
state without first making sure that such a
state existed.

This patch fixes this issue in two different
palces by first checking DA state before
fetching the error message.
---
 sql/sql_acl.cc     | 15 ++++++++++-----
 sql/sql_parse.cc   |  9 ++++++---
 sql/sql_servers.cc | 10 ++++++++--
 3 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 7d8f8ea71b3..7ba1a657578 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -310,7 +310,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
 {
   TABLE *table;
   READ_RECORD read_record_info;
-  my_bool return_val= 1;
+  my_bool return_val= TRUE;
   bool check_no_resolve= specialflag & SPECIAL_NO_RESOLVE;
   char tmp_name[NAME_LEN+1];
   int password_length;
@@ -623,7 +623,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
   init_check_host();
 
   initialized=1;
-  return_val=0;
+  return_val= FALSE;
 
 end:
   thd->variables.sql_mode= old_sql_mode;
@@ -674,7 +674,7 @@ my_bool acl_reload(THD *thd)
   DYNAMIC_ARRAY old_acl_hosts,old_acl_users,old_acl_dbs;
   MEM_ROOT old_mem;
   bool old_initialized;
-  my_bool return_val= 1;
+  my_bool return_val= TRUE;
   DBUG_ENTER("acl_reload");
 
   if (thd->locked_tables)
@@ -701,8 +701,13 @@ my_bool acl_reload(THD *thd)
 
   if (simple_open_n_lock_tables(thd, tables))
   {
-    sql_print_error("Fatal error: Can't open and lock privilege tables: %s",
-		    thd->main_da.message());
+    /*
+      Execution might have been interrupted; only print the error message
+      if an error condition has been raised.
+    */
+    if (thd->main_da.is_error())
+      sql_print_error("Fatal error: Can't open and lock privilege tables: %s",
+                      thd->main_da.message());
     goto end;
   }
 
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 69c9ddc7806..2c466d31e7c 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -6787,13 +6787,13 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
       thd->store_globals();
       lex_start(thd);
     }
-    
+
     if (thd)
     {
       bool reload_acl_failed= acl_reload(thd);
       bool reload_grants_failed= grant_reload(thd);
       bool reload_servers_failed= servers_reload(thd);
-      
+
       if (reload_acl_failed || reload_grants_failed || reload_servers_failed)
       {
         result= 1;
@@ -6949,7 +6949,10 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
  if (options & REFRESH_USER_RESOURCES)
    reset_mqh((LEX_USER *) NULL, 0);             /* purecov: inspected */
  *write_to_binlog= tmp_write_to_binlog;
- return result;
+ /*
+   If the query was killed then this function must fail.
+ */
+ return result || thd->killed;
 }
 
 
diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc
index f8a8dea18ff..1655426bb4a 100644
--- a/sql/sql_servers.cc
+++ b/sql/sql_servers.cc
@@ -241,8 +241,14 @@ bool servers_reload(THD *thd)
 
   if (simple_open_n_lock_tables(thd, tables))
   {
-    sql_print_error("Can't open and lock privilege tables: %s",
-		    thd->main_da.message());
+    /*
+      Execution might have been interrupted; only print the error message
+      if an error condition has been raised.
+    */
+    if (thd->main_da.is_error())
+      sql_print_error("Can't open and lock privilege tables: %s",
+                      thd->main_da.message());
+    return_val= FALSE;
     goto end;
   }
 
-- 
2.30.9