@@ -267,6 +267,19 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER
267267 pfc -> data -> packet_no ++ ;
268268 DBG_RETURN (PASS );
269269 }
270+ // @see https://dev.mysql.com/worklog/task/?id=12999
271+ if (header -> size > 0 ) {
272+ zend_uchar * buf = mnd_emalloc (header -> size );
273+ if ((PASS == pfc -> data -> m .receive (pfc , vio , buf , header -> size , conn_stats , error_info )) && buf [0 ] == ERROR_MARKER ) {
274+ php_mysqlnd_read_error_from_line (buf + 1 , header -> size - 1 ,
275+ error_info -> error , sizeof (error_info -> error ),
276+ & error_info -> error_no , error_info -> sqlstate
277+ );
278+ mnd_efree (buf );
279+ DBG_RETURN (FAIL );
280+ }
281+ mnd_efree (buf );
282+ }
270283
271284 DBG_ERR_FMT ("Logical link: packets out of order. Expected %u received %u. Packet size=%zu" ,
272285 pfc -> data -> packet_no , header -> packet_no , header -> size );
@@ -294,7 +307,9 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header,
294307 DBG_INF_FMT ("buf=%p size=%zu" , buf , buf_size );
295308 if (FAIL == mysqlnd_read_header (pfc , vio , packet_header , stats , error_info )) {
296309 SET_CONNECTION_STATE (connection_state , CONN_QUIT_SENT );
297- SET_CLIENT_ERROR (error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
310+ if (error_info -> error_no == 0 ) {
311+ SET_CLIENT_ERROR (error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
312+ }
298313 DBG_ERR_FMT ("Can't read %s's header" , packet_type_as_text );
299314 DBG_RETURN (FAIL );
300315 }
0 commit comments