@@ -267,6 +267,24 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER
267
267
pfc -> data -> packet_no ++ ;
268
268
DBG_RETURN (PASS );
269
269
}
270
+ // @see https://dev.mysql.com/worklog/task/?id=12999
271
+ if (header -> size > 0 ) {
272
+ DBG_ERR_FMT ("Logical link: try reap pending data. Packet size=%zu" , header -> size );
273
+ zend_uchar * buf = emalloc (header -> size );
274
+ if ((PASS == pfc -> data -> m .receive (pfc , vio , buf , header -> size , conn_stats , error_info )) && buf [0 ] == ERROR_MARKER ) {
275
+ php_mysqlnd_read_error_from_line (buf + 1 , header -> size - 1 ,
276
+ error_info -> error , sizeof (error_info -> error ),
277
+ & error_info -> error_no , error_info -> sqlstate
278
+ );
279
+ if (error_info -> error_no == ER_CLIENT_INTERACTION_TIMEOUT ) {
280
+ efree (buf );
281
+ DBG_RETURN (FAIL );
282
+ } else {
283
+ error_info -> error_no = 0 ;
284
+ }
285
+ }
286
+ efree (buf );
287
+ }
270
288
271
289
DBG_ERR_FMT ("Logical link: packets out of order. Expected %u received %u. Packet size=%zu" ,
272
290
pfc -> data -> packet_no , header -> packet_no , header -> size );
@@ -292,9 +310,12 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header,
292
310
{
293
311
DBG_ENTER ("mysqlnd_read_packet_header_and_body" );
294
312
DBG_INF_FMT ("buf=%p size=%zu" , buf , buf_size );
313
+ assert (error_info -> error_no == 0 );
295
314
if (FAIL == mysqlnd_read_header (pfc , vio , packet_header , stats , error_info )) {
296
315
SET_CONNECTION_STATE (connection_state , CONN_QUIT_SENT );
297
- SET_CLIENT_ERROR (error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
316
+ if (error_info -> error_no == 0 ) {
317
+ SET_CLIENT_ERROR (error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
318
+ }
298
319
DBG_ERR_FMT ("Can't read %s's header" , packet_type_as_text );
299
320
DBG_RETURN (FAIL );
300
321
}
0 commit comments