29
29
#include "zend_ini.h"
30
30
31
31
#define MYSQLND_SILENT 1
32
-
33
32
#define MYSQLND_DUMP_HEADER_N_BODY
34
33
35
- #define PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_size , packet_type_as_text , packet_type ) \
36
- { \
37
- DBG_INF_FMT("buf=%p size=%u", (buf), (buf_size)); \
38
- if (FAIL == mysqlnd_read_header((conn)->net, &((packet)->header), (conn)->stats, ((conn)->error_info))) {\
39
- CONN_SET_STATE(conn, CONN_QUIT_SENT); \
40
- SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\
41
- php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); \
42
- DBG_ERR_FMT("Can't read %s's header", (packet_type_as_text)); \
43
- DBG_RETURN(FAIL);\
44
- }\
45
- if ((buf_size) < (packet)->header.size) { \
46
- DBG_ERR_FMT("Packet buffer %u wasn't big enough %u, %u bytes will be unread", \
47
- (buf_size), (packet)->header.size, (packet)->header.size - (buf_size)); \
48
- DBG_RETURN(FAIL); \
49
- }\
50
- if (FAIL == conn->net->data->m.receive_ex((conn)->net, (buf), (packet)->header.size, (conn)->stats, ((conn)->error_info))) { \
51
- CONN_SET_STATE(conn, CONN_QUIT_SENT); \
52
- SET_CLIENT_ERROR(*conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);\
53
- php_error_docref(NULL, E_WARNING, "%s", mysqlnd_server_gone); \
54
- DBG_ERR_FMT("Empty '%s' packet body", (packet_type_as_text)); \
55
- DBG_RETURN(FAIL);\
56
- } \
57
- MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], \
58
- MYSQLND_HEADER_SIZE + (packet)->header.size, \
59
- packet_type_to_statistic_packet_count[packet_type], \
60
- 1); \
61
- }
62
-
63
-
64
34
#define BAIL_IF_NO_MORE_DATA \
65
35
if ((size_t)(p - begin) > packet->header.size) { \
66
36
php_error_docref(NULL, E_WARNING, "Premature end of data (mysqlnd_wireprotocol.c:%u)", __LINE__); \
@@ -316,6 +286,42 @@ mysqlnd_read_header(MYSQLND_NET * net, MYSQLND_PACKET_HEADER * header,
316
286
/* }}} */
317
287
318
288
289
+ /* {{{ mysqlnd_read_packet_header_and_body */
290
+ static enum_func_status
291
+ mysqlnd_read_packet_header_and_body (MYSQLND_PACKET_HEADER * packet_header , MYSQLND_CONN_DATA * conn ,
292
+ zend_uchar * buf , size_t buf_size , const char * const packet_type_as_text ,
293
+ enum mysqlnd_packet_type packet_type )
294
+ {
295
+ DBG_ENTER ("mysqlnd_read_packet_header_and_body" );
296
+ DBG_INF_FMT ("buf=%p size=%u" , buf , buf_size );
297
+ if (FAIL == mysqlnd_read_header (conn -> net , packet_header , conn -> stats , conn -> error_info )) {
298
+ CONN_SET_STATE (conn , CONN_QUIT_SENT );
299
+ SET_CLIENT_ERROR (* conn -> error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
300
+ php_error_docref (NULL , E_WARNING , "%s" , mysqlnd_server_gone );
301
+ DBG_ERR_FMT ("Can't read %s's header" , packet_type_as_text );
302
+ DBG_RETURN (FAIL );
303
+ }
304
+ if (buf_size < packet_header -> size ) {
305
+ DBG_ERR_FMT ("Packet buffer %u wasn't big enough %u, %u bytes will be unread" ,
306
+ buf_size , packet_header -> size , packet_header -> size - buf_size );
307
+ DBG_RETURN (FAIL );
308
+ }
309
+ if (FAIL == conn -> net -> data -> m .receive_ex (conn -> net , buf , packet_header -> size , conn -> stats , conn -> error_info )) {
310
+ CONN_SET_STATE (conn , CONN_QUIT_SENT );
311
+ SET_CLIENT_ERROR (* conn -> error_info , CR_SERVER_GONE_ERROR , UNKNOWN_SQLSTATE , mysqlnd_server_gone );
312
+ php_error_docref (NULL , E_WARNING , "%s" , mysqlnd_server_gone );
313
+ DBG_ERR_FMT ("Empty '%s' packet body" , packet_type_as_text );
314
+ DBG_RETURN (FAIL );
315
+ }
316
+ MYSQLND_INC_CONN_STATISTIC_W_VALUE2 (conn -> stats , packet_type_to_statistic_byte_count [packet_type ],
317
+ MYSQLND_HEADER_SIZE + packet_header -> size ,
318
+ packet_type_to_statistic_packet_count [packet_type ],
319
+ 1 );
320
+ DBG_RETURN (PASS );
321
+ }
322
+ /* }}} */
323
+
324
+
319
325
/* {{{ php_mysqlnd_greet_read */
320
326
static enum_func_status
321
327
php_mysqlnd_greet_read (void * _packet , MYSQLND_CONN_DATA * conn )
@@ -328,7 +334,9 @@ php_mysqlnd_greet_read(void * _packet, MYSQLND_CONN_DATA * conn)
328
334
329
335
DBG_ENTER ("php_mysqlnd_greet_read" );
330
336
331
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , sizeof (buf ), "greeting" , PROT_GREET_PACKET );
337
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , sizeof (buf ), "greeting" , PROT_GREET_PACKET )) {
338
+ DBG_RETURN (FAIL );
339
+ }
332
340
BAIL_IF_NO_MORE_DATA ;
333
341
334
342
packet -> auth_plugin_data = packet -> intern_auth_plugin_data ;
@@ -690,7 +698,9 @@ php_mysqlnd_auth_response_read(void * _packet, MYSQLND_CONN_DATA * conn)
690
698
691
699
/* leave space for terminating safety \0 */
692
700
buf_len -- ;
693
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "OK" , PROT_OK_PACKET );
701
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "OK" , PROT_OK_PACKET )) {
702
+ DBG_RETURN (FAIL );
703
+ }
694
704
BAIL_IF_NO_MORE_DATA ;
695
705
696
706
/*
@@ -851,7 +861,9 @@ php_mysqlnd_ok_read(void * _packet, MYSQLND_CONN_DATA * conn)
851
861
852
862
DBG_ENTER ("php_mysqlnd_ok_read" );
853
863
854
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "OK" , PROT_OK_PACKET );
864
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "OK" , PROT_OK_PACKET )) {
865
+ DBG_RETURN (FAIL );
866
+ }
855
867
BAIL_IF_NO_MORE_DATA ;
856
868
857
869
/* Should be always 0x0 or ERROR_MARKER for error */
@@ -941,7 +953,9 @@ php_mysqlnd_eof_read(void * _packet, MYSQLND_CONN_DATA * conn)
941
953
942
954
DBG_ENTER ("php_mysqlnd_eof_read" );
943
955
944
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "EOF" , PROT_EOF_PACKET );
956
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "EOF" , PROT_EOF_PACKET )) {
957
+ DBG_RETURN (FAIL );
958
+ }
945
959
BAIL_IF_NO_MORE_DATA ;
946
960
947
961
/* Should be always EODATA_MARKER */
@@ -1092,7 +1106,9 @@ php_mysqlnd_rset_header_read(void * _packet, MYSQLND_CONN_DATA * conn)
1092
1106
1093
1107
DBG_ENTER ("php_mysqlnd_rset_header_read" );
1094
1108
1095
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "resultset header" , PROT_RSET_HEADER_PACKET );
1109
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "resultset header" , PROT_RSET_HEADER_PACKET )) {
1110
+ DBG_RETURN (FAIL );
1111
+ }
1096
1112
BAIL_IF_NO_MORE_DATA ;
1097
1113
1098
1114
/*
@@ -1234,7 +1250,9 @@ php_mysqlnd_rset_field_read(void * _packet, MYSQLND_CONN_DATA * conn)
1234
1250
1235
1251
DBG_ENTER ("php_mysqlnd_rset_field_read" );
1236
1252
1237
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "field" , PROT_RSET_FLD_PACKET );
1253
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "field" , PROT_RSET_FLD_PACKET )) {
1254
+ DBG_RETURN (FAIL );
1255
+ }
1238
1256
1239
1257
if (packet -> skip_parsing ) {
1240
1258
DBG_RETURN (PASS );
@@ -1913,7 +1931,9 @@ php_mysqlnd_stats_read(void * _packet, MYSQLND_CONN_DATA * conn)
1913
1931
1914
1932
DBG_ENTER ("php_mysqlnd_stats_read" );
1915
1933
1916
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "statistics" , PROT_STATS_PACKET );
1934
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "statistics" , PROT_STATS_PACKET )) {
1935
+ DBG_RETURN (FAIL );
1936
+ }
1917
1937
1918
1938
packet -> message = mnd_emalloc (packet -> header .size + 1 );
1919
1939
memcpy (packet -> message , buf , packet -> header .size );
@@ -1959,7 +1979,9 @@ php_mysqlnd_prepare_read(void * _packet, MYSQLND_CONN_DATA * conn)
1959
1979
1960
1980
DBG_ENTER ("php_mysqlnd_prepare_read" );
1961
1981
1962
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "prepare" , PROT_PREPARE_RESP_PACKET );
1982
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "prepare" , PROT_PREPARE_RESP_PACKET )) {
1983
+ DBG_RETURN (FAIL );
1984
+ }
1963
1985
BAIL_IF_NO_MORE_DATA ;
1964
1986
1965
1987
data_size = packet -> header .size ;
@@ -2046,7 +2068,9 @@ php_mysqlnd_chg_user_read(void * _packet, MYSQLND_CONN_DATA * conn)
2046
2068
2047
2069
DBG_ENTER ("php_mysqlnd_chg_user_read" );
2048
2070
2049
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , buf_len , "change user response" , PROT_CHG_USER_RESP_PACKET );
2071
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , buf_len , "change user response" , PROT_CHG_USER_RESP_PACKET )) {
2072
+ DBG_RETURN (FAIL );
2073
+ }
2050
2074
BAIL_IF_NO_MORE_DATA ;
2051
2075
2052
2076
/*
@@ -2164,7 +2188,9 @@ php_mysqlnd_sha256_pk_request_response_read(void * _packet, MYSQLND_CONN_DATA *
2164
2188
DBG_ENTER ("php_mysqlnd_sha256_pk_request_response_read" );
2165
2189
2166
2190
/* leave space for terminating safety \0 */
2167
- PACKET_READ_HEADER_AND_BODY (packet , conn , buf , sizeof (buf ), "SHA256_PK_REQUEST_RESPONSE" , PROT_SHA256_PK_REQUEST_RESPONSE_PACKET );
2191
+ if (FAIL == mysqlnd_read_packet_header_and_body (& (packet -> header ), conn , buf , sizeof (buf ), "SHA256_PK_REQUEST_RESPONSE" , PROT_SHA256_PK_REQUEST_RESPONSE_PACKET )) {
2192
+ DBG_RETURN (FAIL );
2193
+ }
2168
2194
BAIL_IF_NO_MORE_DATA ;
2169
2195
2170
2196
p ++ ;
0 commit comments