MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Dmitry Shulga Date:July 21 2010 7:56am
Subject:bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3454) Bug#42496
View as plain text  
#At file:///Users/shulga/projects/mysql/5.1-bugteam-bug42496/ based on revid:dmitry.shulga@stripped

 3454 Dmitry Shulga	2010-07-21
      Fixed bug #42496 - the server could crash on a debug assert after a failure
      to write into a closed socket
     @ sql/protocol.cc
        Protocol::flush modified: set thd->main_da.can_overwrite_status= TRUE
        before call to net_flush() in order to prevent crash on assert in case
        of socket write failure, reset it to FALSE when net_flush() returned;
        Protocol::send_fields modified: return from method with error if call to
        my_net_write(), proto.write() or write_eof_packet() failed.
     @ sql/sql_cache.cc
        Query_cache::send_result_to_client modified: call to
        thd->main_da.disable_status() only if write to socket
        was successful.
     @ sql/sql_cursor.cc
        Materialized_cursor::fetch modified: leave method if call to
        result->send_data() failed.
     @ sql/sql_prepare.cc
        send_prep_stmt() modified: call to thd->main_da.disable_status()
        only if thd->protocol_text.send_fields() completed successfully.

    modified:
      sql/protocol.cc
      sql/sql_cache.cc
      sql/sql_cursor.cc
      sql/sql_prepare.cc
=== modified file 'sql/protocol.cc'
--- a/sql/protocol.cc	2010-03-23 15:00:50 +0000
+++ b/sql/protocol.cc	2010-07-21 07:56:43 +0000
@@ -534,7 +534,11 @@ void Protocol::end_partial_result_set(TH
 bool Protocol::flush()
 {
 #ifndef EMBEDDED_LIBRARY
-  return net_flush(&thd->net);
+  bool error;
+  thd->main_da.can_overwrite_status= TRUE;
+  error= net_flush(&thd->net);
+  thd->main_da.can_overwrite_status= FALSE;
+  return error;
 #else
   return 0;
 #endif
@@ -574,7 +578,8 @@ bool Protocol::send_fields(List<Item> *l
   if (flags & SEND_NUM_ROWS)
   {				// Packet with number of elements
     uchar *pos= net_store_length(buff, list->elements);
-    (void) my_net_write(&thd->net, buff, (size_t) (pos-buff));
+    if (my_net_write(&thd->net, buff, (size_t) (pos-buff)))
+      DBUG_RETURN(1);
   }
 
 #ifndef DBUG_OFF
@@ -698,7 +703,7 @@ bool Protocol::send_fields(List<Item> *l
     if (flags & SEND_DEFAULTS)
       item->send(&prot, &tmp);			// Send default value
     if (prot.write())
-      break;					/* purecov: inspected */
+      DBUG_RETURN(1);
 #ifndef DBUG_OFF
     field_types[count++]= field.type;
 #endif
@@ -711,7 +716,9 @@ bool Protocol::send_fields(List<Item> *l
       to show that there is no cursor.
       Send no warning information, as it will be sent at statement end.
     */
-    write_eof_packet(thd, &thd->net, thd->server_status, thd->total_warn_count);
+    if (write_eof_packet(thd, &thd->net, thd->server_status,
+                         thd->total_warn_count))
+      DBUG_RETURN(1);
   }
   DBUG_RETURN(prepare_for_send(list));
 

=== modified file 'sql/sql_cache.cc'
--- a/sql/sql_cache.cc	2009-11-20 12:49:06 +0000
+++ b/sql/sql_cache.cc	2010-07-21 07:56:43 +0000
@@ -1653,7 +1653,8 @@ def_week_frmt: %lu, in_trans: %d, autoco
 
   thd->limit_found_rows = query->found_rows();
   thd->status_var.last_query_cost= 0.0;
-  thd->main_da.disable_status();
+  if (!thd->main_da.is_set())
+    thd->main_da.disable_status();
 
   BLOCK_UNLOCK_RD(query_block);
   DBUG_RETURN(1);				// Result sent to client

=== modified file 'sql/sql_cursor.cc'
--- a/sql/sql_cursor.cc	2008-12-10 14:16:21 +0000
+++ b/sql/sql_cursor.cc	2010-07-21 07:56:43 +0000
@@ -658,7 +658,12 @@ void Materialized_cursor::fetch(ulong nu
     if ((res= table->file->rnd_next(table->record[0])))
       break;
     /* Send data only if the read was successful. */
-    result->send_data(item_list);
+    /*
+      If network write failed (i.e. due to a closed socked),
+      the error has already been set. Just return.
+    */
+    if (result->send_data(item_list))
+      return;
   }
 
   switch (res) {

=== modified file 'sql/sql_prepare.cc'
--- a/sql/sql_prepare.cc	2010-06-28 20:29:19 +0000
+++ b/sql/sql_prepare.cc	2010-07-21 07:56:43 +0000
@@ -263,8 +263,11 @@ static bool send_prep_stmt(Prepared_stat
                                           &stmt->lex->param_list,
                                           Protocol::SEND_EOF);
   }
-  /* Flag that a response has already been sent */
-  thd->main_da.disable_status();
+
+  if (!error)
+    /* Flag that a response has already been sent */
+    thd->main_da.disable_status();
+
   DBUG_RETURN(error);
 }
 #else


Attachment: [text/bzr-bundle] bzr/dmitry.shulga@sun.com-20100721075643-c20hfi9pnxcacspq.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3454) Bug#42496Dmitry Shulga21 Jul
  • Re: bzr commit into mysql-5.1-bugteam branch (Dmitry.Shulga:3454)Bug#42496Davi Arnaut22 Jul