Fixed bug #42496 - the server could crash on a debug assert after a failure
to write into a closed socket
This commit is contained in:
parent
48a74d7472
commit
49d327ebf7
@ -534,7 +534,11 @@ void Protocol::end_partial_result_set(THD *thd_arg)
|
||||
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> *list, uint flags)
|
||||
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> *list, uint flags)
|
||||
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> *list, uint flags)
|
||||
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));
|
||||
|
||||
|
@ -1653,7 +1653,8 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d",
|
||||
|
||||
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
|
||||
|
@ -658,7 +658,12 @@ void Materialized_cursor::fetch(ulong num_rows)
|
||||
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) {
|
||||
|
@ -263,8 +263,11 @@ static bool send_prep_stmt(Prepared_statement *stmt, uint columns)
|
||||
&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
|
||||
|
Loading…
x
Reference in New Issue
Block a user