27#define BAIL_IF_NO_MORE_DATA \
28 if (UNEXPECTED((size_t)(p - begin) > packet->header.size)) { \
29 php_error_docref(NULL, E_WARNING, "Premature end of data (mysqlnd_wireprotocol.c:%u)", __LINE__); \
34static const char *unknown_sqlstate=
"HY000";
41#define ERROR_MARKER 0xFF
42#define EODATA_MARKER 0xFE
44#define MARIADB_RPL_VERSION_HACK "5.5.5-"
49 "SLEEP",
"QUIT",
"INIT_DB",
"QUERY",
"FIELD_LIST",
50 "CREATE_DB",
"DROP_DB",
"REFRESH",
"SHUTDOWN",
"STATISTICS",
51 "PROCESS_INFO",
"CONNECT",
"PROCESS_KILL",
"DEBUG",
"PING",
52 "TIME",
"DELAYED_INSERT",
"CHANGE_USER",
"BINLOG_DUMP",
53 "TABLE_DUMP",
"CONNECT_OUT",
"REGISTER_SLAVE",
54 "STMT_PREPARE",
"STMT_EXECUTE",
"STMT_SEND_LONG_DATA",
"STMT_CLOSE",
55 "STMT_RESET",
"SET_OPTION",
"STMT_FETCH",
"DAEMON",
"BINLOG_DUMP_GTID",
130 return (uint64_t) *
p;
155 if (length < (uint64_t)
L64(251)) {
160 if (length < (uint64_t)
L64(65536)) {
166 if (length < (uint64_t)
L64(16777216)) {
182 if (length < (uint64_t)
L64(251)) {
185 if (length < (uint64_t)
L64(65536)) {
188 if (length < (uint64_t)
L64(16777216)) {
198php_mysqlnd_read_error_from_line(
const zend_uchar *
const buf,
const size_t buf_len,
199 char *
error,
const size_t error_buf_len,
203 size_t error_msg_len = 0;
205 DBG_ENTER(
"php_mysqlnd_read_error_from_line");
226 if ((buf_len - (
p -
buf)) > 0) {
227 error_msg_len =
MIN((
int)((buf_len - (
p -
buf))), (
int) (error_buf_len - 1));
233 error[error_msg_len]=
'\0';
256 DBG_INF_FMT(
"HEADER: prot_packet_no=%u size=%3zu",
header->packet_no,
header->size);
274 php_mysqlnd_read_error_from_line(
buf + 1,
header->size - 1,
284 DBG_ERR_FMT(
"Logical link: packets out of order. Expected %u received %u. Packet size=%zu",
287 php_error(
E_WARNING,
"Packets out of order. Expected %u received %u. Packet size=%zu",
303 const char *
const packet_type_as_text,
306 DBG_ENTER(
"mysqlnd_read_packet_header_and_body");
307 DBG_INF_FMT(
"buf=%p size=%zu",
buf, buf_size);
308 if (
FAIL == mysqlnd_read_header(pfc, vio, packet_header, stats, error_info)) {
313 DBG_ERR_FMT(
"Can't read %s's header", packet_type_as_text);
316 if (buf_size < packet_header->
size) {
317 DBG_ERR_FMT(
"Packet buffer %zu wasn't big enough %zu, %zu bytes will be unread",
318 buf_size, packet_header->
size, packet_header->
size - buf_size);
322 if (
FAIL == pfc->
data->m.receive(pfc, vio,
buf, packet_header->
size, stats, error_info)) {
325 DBG_ERR_FMT(
"Empty '%s' packet body", packet_type_as_text);
330 packet_type_to_statistic_packet_count[packet_type],
353 DBG_ENTER(
"php_mysqlnd_greet_read");
355 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"greeting",
PROT_GREET_PACKET)) {
360 packet->authentication_plugin_data.s = packet->intern_auth_plugin_data;
361 packet->authentication_plugin_data.l =
sizeof(packet->intern_auth_plugin_data);
368 php_mysqlnd_read_error_from_line(
p, packet->header.size - 1,
369 packet->error,
sizeof(packet->error),
370 &packet->error_no, packet->sqlstate
377 if (packet->error_no == 1040) {
389 packet->server_version =
estrdup((
char *)
p);
390 p+=
strlen(packet->server_version) + 1;
408 DBG_INF_FMT(
"4.1 server_caps=%u\n", (uint32_t) packet->server_capabilities);
423 if ((
size_t) (
p -
buf) < packet->header.size) {
429 packet->pre41 =
TRUE;
433 if ((
size_t) (
p -
buf) < packet->header.size) {
438 DBG_INF_FMT(
"additional 5.5+ caps=%u\n", (uint32_t)
uint2korr(pad_start));
439 packet->server_capabilities |= ((uint32_t)
uint2korr(pad_start)) << 16;
441 packet->authentication_plugin_data.l =
uint1korr(pad_start + 2);
444 char * new_auth_plugin_data =
emalloc(packet->authentication_plugin_data.l);
451 packet->authentication_plugin_data.s = new_auth_plugin_data;
458 size_t remaining_size = packet->header.size - (size_t)(
p -
buf);
459 if (remaining_size == 0) {
461 packet->auth_protocol =
estrdup(
"");
464 char *null_terminator = memchr(
p,
'\0', remaining_size);
465 size_t auth_protocol_len;
466 if (null_terminator) {
468 auth_protocol_len = null_terminator - (
char *)
p;
471 auth_protocol_len = remaining_size;
473 char *auth_protocol =
emalloc(auth_protocol_len + 1);
474 memcpy(auth_protocol,
p, auth_protocol_len);
475 auth_protocol[auth_protocol_len] =
'\0';
476 packet->auth_protocol = auth_protocol;
478 p += auth_protocol_len;
479 if (null_terminator) {
485 DBG_INF_FMT(
"proto=%u server=%s thread_id=%u",
486 packet->protocol_version, packet->server_version, packet->thread_id);
488 DBG_INF_FMT(
"server_capabilities=%u charset_no=%u server_status=%i auth_protocol=%s scramble_length=%zu",
489 packet->server_capabilities, packet->charset_no, packet->server_status,
490 packet->auth_protocol? packet->auth_protocol:
"n/a", packet->authentication_plugin_data.l);
494 DBG_ERR_FMT(
"GREET packet %zu bytes shorter than expected",
p -
begin - packet->header.size);
496 p -
begin - packet->header.size);
504void php_mysqlnd_greet_free_mem(
void * _packet)
507 if (
p->server_version) {
509 p->server_version =
NULL;
511 if (
p->authentication_plugin_data.s &&
p->authentication_plugin_data.s !=
p->intern_auth_plugin_data) {
512 efree(
p->authentication_plugin_data.s);
513 p->authentication_plugin_data.s =
NULL;
515 if (
p->auth_protocol) {
517 p->auth_protocol =
NULL;
523#define AUTH_WRITE_BUFFER_LEN (MYSQLND_HEADER_SIZE + MYSQLND_MAX_ALLOWED_USER_LEN + SCRAMBLE_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1 + 4096)
539 DBG_ENTER(
"php_mysqlnd_auth_write");
565 const char *
const msg =
"Authentication data too long. "
566 "Won't fit into the buffer and will be truncated. Authentication will thus fail";
576 DBG_ERR(
"the stack buffer was not enough!!");
586 p = zend_mempcpy(
p, packet->
db, real_db_len);
607 size_t ca_payload_len = 0;
619 ca_payload_len += value_len;
639 p = zend_mempcpy(
p,
Z_STRVAL_P(entry_value), value_len);
651 const unsigned int silent = packet->
silent;
653 ret = conn->command->change_user(conn, payload, silent);
685 DBG_ENTER(
"php_mysqlnd_auth_response_read");
687 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"OK",
PROT_OK_PACKET)) {
698 php_mysqlnd_read_error_from_line(
p, packet->header.size - 1,
699 packet->error,
sizeof(packet->error),
700 &packet->error_no, packet->sqlstate
704 if (0xFE == packet->response_code) {
706 if (packet->header.size > (
size_t) (
p -
buf)) {
708 packet->new_auth_protocol_len =
strlen(packet->new_auth_protocol);
709 p+= packet->new_auth_protocol_len + 1;
711 packet->new_auth_protocol_data_len = packet->header.size - (size_t) (
p -
buf);
712 if (packet->new_auth_protocol_data_len) {
713 packet->new_auth_protocol_data =
mnd_emalloc(packet->new_auth_protocol_data_len);
714 memcpy(packet->new_auth_protocol_data,
p, packet->new_auth_protocol_data_len);
716 DBG_INF_FMT(
"The server requested switching auth plugin to : %s", packet->new_auth_protocol);
717 DBG_INF_FMT(
"Server salt : [%zu][%.*s]", packet->new_auth_protocol_data_len, (
int) packet->new_auth_protocol_data_len, packet->new_auth_protocol_data);
740 if ((
p -
buf) > packet->header.size || packet->header.size - (
p -
buf) < net_len) {
741 DBG_ERR_FMT(
"OK packet message length is past the packet size");
745 packet->message_len = net_len;
748 packet->message =
NULL;
749 packet->message_len = 0;
752 DBG_INF_FMT(
"OK packet: aff_rows=%" PRIu64
" last_ins_id=%" PRIu64
" server_status=%u warnings=%u",
753 packet->affected_rows, packet->last_insert_id, packet->server_status,
754 packet->warning_count);
759 DBG_ERR_FMT(
"OK packet %zu bytes shorter than expected",
p -
begin - packet->header.size);
761 p -
begin - packet->header.size);
769php_mysqlnd_auth_response_free_mem(
void * _packet)
776 if (
p->new_auth_protocol) {
778 p->new_auth_protocol =
NULL;
780 p->new_auth_protocol_len = 0;
782 if (
p->new_auth_protocol_data) {
784 p->new_auth_protocol_data =
NULL;
786 p->new_auth_protocol_data_len = 0;
805 DBG_ENTER(
"php_mysqlnd_change_auth_response_write");
845 DBG_ENTER(
"php_mysqlnd_ok_read");
847 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->
header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"OK",
PROT_OK_PACKET)) {
858 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
859 packet->error,
sizeof(packet->error),
860 &packet->error_no, packet->sqlstate
881 packet->message_len =
MIN(net_len, buf_len - (
p -
begin));
884 packet->message =
NULL;
885 packet->message_len = 0;
888 DBG_INF_FMT(
"OK packet: aff_rows=%" PRIu64
" last_ins_id=%" PRIu64
" server_status=%u warnings=%u",
889 packet->affected_rows, packet->last_insert_id, packet->server_status,
890 packet->warning_count);
896 DBG_ERR_FMT(
"OK packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
906php_mysqlnd_ok_free_mem(
void * _packet)
938 DBG_ENTER(
"php_mysqlnd_eof_read");
940 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->
header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"EOF",
PROT_EOF_PACKET)) {
951 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
952 packet->error,
sizeof(packet->error),
953 &packet->error_no, packet->sqlstate
972 packet->warning_count = 0;
973 packet->server_status = 0;
978 DBG_INF_FMT(
"EOF packet: fields=%u status=%u warnings=%u",
979 packet->field_count, packet->server_status, packet->warning_count);
983 DBG_ERR_FMT(
"EOF packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
1003 DBG_ENTER(
"php_mysqlnd_cmd_write");
1008 pfc->
data->m.reset(pfc, stats, error_info);
1012#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
1013 vio->
data->m.consume_uneaten_data(vio, packet->
command);
1020 sent = pfc->
data->m.send(pfc, vio,
buffer, 1, stats, error_info);
1067 DBG_ENTER(
"php_mysqlnd_rset_header_read");
1069 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->
header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"resultset header",
PROT_RSET_HEADER_PACKET)) {
1082 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
1083 packet->error_info.error,
sizeof(packet->error_info.error),
1084 &packet->error_info.error_no, packet->error_info.sqlstate
1092 switch (packet->field_count) {
1094 DBG_INF(
"LOAD LOCAL");
1104 memcpy(packet->info_or_local_file.s,
p,
len);
1105 packet->info_or_local_file.s[
len] =
'\0';
1106 packet->info_or_local_file.l =
len;
1129 DBG_ERR_FMT(
"RSET_HEADER packet additional data length is past %zu bytes the packet size",
1130 local_file_name_over_read);
1132 "RSET_HEADER packet additional data length is past %zu bytes the packet size",
1133 local_file_name_over_read);
1137 memcpy(packet->info_or_local_file.s,
p,
len);
1138 packet->info_or_local_file.s[
len] =
'\0';
1139 packet->info_or_local_file.l =
len;
1141 DBG_INF_FMT(
"affected_rows=%" PRIu64
" last_insert_id=%" PRIu64
" server_status=%u warning_count=%u",
1142 packet->affected_rows, packet->last_insert_id,
1143 packet->server_status, packet->warning_count);
1154 DBG_ERR_FMT(
"RSET_HEADER packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
1164void php_mysqlnd_rset_header_free_mem(
void * _packet)
1167 DBG_ENTER(
"php_mysqlnd_rset_header_free_mem");
1168 mysqlnd_set_string(&
p->info_or_local_file,
NULL, 0);
1173#define READ_RSET_FIELD(field_name) do { \
1174 len = php_mysqlnd_net_field_length(&p); \
1175 if (UNEXPECTED(len == MYSQLND_NULL_LENGTH)) { \
1176 goto faulty_or_fake; \
1177 } else if (len != 0) { \
1178 meta->field_name = (const char *)p; \
1179 meta->field_name ## _length = len; \
1181 total_len += len + 1; \
1183 meta->field_name = mysqlnd_empty_string; \
1184 meta->field_name ## _length = 0; \
1201 size_t total_len = 0;
1209 DBG_ENTER(
"php_mysqlnd_rset_field_read");
1211 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->
header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"field",
PROT_RSET_FLD_PACKET)) {
1224 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
1232 DBG_ERR(
"Premature EOF. That should be COM_FIELD_LIST");
1248 DBG_ERR_FMT(
"Protocol error. Server sent false length. Expected 12 got %d", (
int) *
p);
1291 DBG_ERR_FMT(
"Protocol error. Server sent default for unsupported field list");
1293 "Protocol error. Server sent default for unsupported field list (mysqlnd_wireprotocol.c:%u)",
1312 *(root_ptr +=
len) =
'\0';
1319 *(root_ptr +=
len) =
'\0';
1326 *(root_ptr +=
len) =
'\0';
1333 *(root_ptr +=
len) =
'\0';
1340 *(root_ptr +=
len) =
'\0';
1344 DBG_INF_FMT(
"allocing root.");
1346 DBG_INF_FMT(
"FIELD=[%s.%s.%s]", meta->
db? meta->
db:
"*NA*", meta->
table? meta->
table:
"*NA*",
1352 DBG_ERR_FMT(
"Protocol error. Server sent NULL_LENGTH. The server is faulty");
1354 " The server is faulty");
1357 DBG_ERR_FMT(
"RSET field packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
1366static void set_packet_error(
1383 size_t *
const data_size)
1388 size_t prealloc_more_bytes;
1390 DBG_ENTER(
"php_mysqlnd_read_row_ex");
1404 prealloc_more_bytes = 1;
1417 p =
buf + *data_size;
1418 *data_size +=
header.size;
1421 DBG_ERR(
"Empty row packet body");
1427 if (
FAIL == mysqlnd_read_header(pfc, vio, &
header, stats, error_info)) {
1439 *data_size +=
header.size;
1442 DBG_ERR(
"Empty row packet body");
1455 const unsigned int field_count,
const MYSQLND_FIELD *
const fields_metadata,
1459 size_t rbs = row_buffer->
size;
1464 zval *current_field, *end_field, *start_field;
1466 DBG_ENTER(
"php_mysqlnd_rowp_read_binary_protocol");
1472 end_field = (start_field = fields) + field_count;
1477 p += (field_count + 9)/8;
1480 for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) {
1484 DBG_INF_FMT(
"Into zval=%p decoding column %u [%s.%s.%s] type=%u field->flags&unsigned=%u flags=%u is_bit=%u",
1486 fields_metadata[i].db, fields_metadata[i].table, fields_metadata[i].
name, fields_metadata[i].
type,
1488 if (*null_ptr & bit) {
1489 DBG_INF(
"It's null");
1494 size_t row_position =
p - rbp;
1495 if (rbs <= row_position) {
1496 for (
j = 0, current_field = start_field;
j < i; current_field++,
j++) {
1504 for (
j = 0, current_field = start_field;
j < i; current_field++,
j++) {
1511 switch (fields_metadata[i].
type) {
1547 Z_STRLEN_P(current_field) : (
size_t)(
p - orig_p));
1549 if (!((bit<<=1) & 255)) {
1563 unsigned int field_count,
const MYSQLND_FIELD * fields_metadata,
1567 zval *current_field, *end_field, *start_field;
1569 const size_t data_size = row_buffer->
size;
1572 DBG_ENTER(
"php_mysqlnd_rowp_read_text_protocol");
1578 end_field = (start_field = fields) + field_count;
1580 for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) {
1587 }
else if (
p > packet_end ||
len > packet_end -
p) {
1589 for (
j = 0, current_field = start_field;
j < i; current_field++,
j++) {
1598 switch (fields_metadata[i].
type) {
1662 _atoi64((
char *)
p);
1668 strtoull((
char *)
p,
NULL, 10);
1670 _strtoui64((
char *)
p,
NULL, 10);
1674#if SIZEOF_ZEND_LONG==8
1675 if (uns ==
TRUE &&
v > 9223372036854775807L)
1676#elif SIZEOF_ZEND_LONG==4
1677 if ((uns ==
TRUE &&
v >
L64(2147483647)) ||
1678 (uns ==
FALSE && ((
L64(2147483647) < (int64_t)
v) ||
1679 (
L64(-2147483648) > (int64_t)
v))))
1681#error Need fix for this architecture
1719 size_t data_size = 0;
1721 DBG_ENTER(
"php_mysqlnd_rowp_read");
1723 ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info, &conn->
state,
1752 php_mysqlnd_read_error_from_line(
p + 1, data_size - 1,
1761 if (data_size > 1) {
1794 DBG_ENTER(
"php_mysqlnd_stats_read");
1796 if (
FAIL == mysqlnd_read_packet_header_and_body(&(packet->
header), pfc, vio, stats, error_info, connection_state,
buf, buf_len,
"statistics",
PROT_STATS_PACKET)) {
1802 packet->message.s[packet->
header.
size] =
'\0';
1812void php_mysqlnd_stats_free_mem(
void * _packet)
1815 mysqlnd_set_string(&
p->message,
NULL, 0);
1821#define PREPARE_RESPONSE_SIZE_41 9
1822#define PREPARE_RESPONSE_SIZE_50 12
1839 unsigned int data_size;
1841 DBG_ENTER(
"php_mysqlnd_prepare_read");
1854 php_mysqlnd_read_error_from_line(
p, data_size - 1,
1866 DBG_ERR_FMT(
"Wrong COM_STMT_PREPARE response size. Received %u", data_size);
1867 php_error(
E_WARNING,
"Wrong COM_STMT_PREPARE response size. Received %u", data_size);
1884 if (data_size > 9) {
1892 DBG_INF_FMT(
"Prepare packet read: stmt_id=" ZEND_ULONG_FMT " fields=%u params=%u",
1899 DBG_ERR_FMT(
"PREPARE packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
1923 DBG_ENTER(
"php_mysqlnd_chg_user_read");
1941 packet->server_asked_323_auth =
TRUE;
1946 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
1954 if (packet->response_code == 0xFE && packet->
header.
size > (
size_t) (
p -
buf)) {
1956 packet->new_auth_protocol_len =
strlen(packet->new_auth_protocol);
1957 p+= packet->new_auth_protocol_len + 1;
1958 packet->new_auth_protocol_data_len = packet->
header.
size - (size_t) (
p -
buf);
1959 if (packet->new_auth_protocol_data_len) {
1960 packet->new_auth_protocol_data =
mnd_emalloc(packet->new_auth_protocol_data_len);
1961 memcpy(packet->new_auth_protocol_data,
p, packet->new_auth_protocol_data_len);
1963 DBG_INF_FMT(
"The server requested switching auth plugin to : %s", packet->new_auth_protocol);
1964 DBG_INF_FMT(
"Server salt : [%*s]", (
int) packet->new_auth_protocol_data_len, packet->new_auth_protocol_data);
1969 DBG_ERR_FMT(
"CHANGE_USER packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
1979php_mysqlnd_chg_user_free_mem(
void * _packet)
1983 if (
p->new_auth_protocol) {
1985 p->new_auth_protocol =
NULL;
1987 p->new_auth_protocol_len = 0;
1989 if (
p->new_auth_protocol_data) {
1991 p->new_auth_protocol_data =
NULL;
1993 p->new_auth_protocol_data_len = 0;
2000size_t php_mysqlnd_sha256_pk_request_write(
MYSQLND_CONN_DATA * conn,
void * _packet)
2009 DBG_ENTER(
"php_mysqlnd_sha256_pk_request_write");
2012 sent = pfc->
data->m.send(pfc, vio,
buffer, 1, stats, error_info);
2021php_mysqlnd_sha256_pk_request_response_read(
MYSQLND_CONN_DATA * conn,
void * _packet)
2034 DBG_ENTER(
"php_mysqlnd_sha256_pk_request_response_read");
2046 packet->public_key =
mnd_emalloc(packet->public_key_len + 1);
2047 memcpy(packet->public_key,
p, packet->public_key_len);
2048 packet->public_key[packet->public_key_len] =
'\0';
2053 DBG_ERR_FMT(
"OK packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
2063php_mysqlnd_sha256_pk_request_response_free_mem(
void * _packet)
2066 if (
p->public_key) {
2068 p->public_key =
NULL;
2070 p->public_key_len = 0;
2075size_t php_mysqlnd_cached_sha2_result_write(
MYSQLND_CONN_DATA * conn,
void * _packet)
2086 DBG_ENTER(
"php_mysqlnd_cached_sha2_result_write");
2090 sent = pfc->
data->m.send(pfc, vio,
buffer, 1, stats, error_info);
2116 DBG_ENTER(
"php_mysqlnd_cached_sha2_result_read");
2127 php_mysqlnd_read_error_from_line(
p, packet->
header.
size - 1,
2145 DBG_INF_FMT(
"The server requested switching auth plugin to : %s", packet->
new_auth_protocol);
2152 DBG_ERR_FMT(
"Unexpected response code %d", packet->
response_code);
2166 DBG_ERR_FMT(
"OK packet %zu bytes shorter than expected",
p -
begin - packet->
header.
size);
2177 php_mysqlnd_greet_read,
2179 php_mysqlnd_greet_free_mem,
2183 php_mysqlnd_auth_write,
2187 php_mysqlnd_auth_response_read,
2189 php_mysqlnd_auth_response_free_mem,
2193 php_mysqlnd_change_auth_response_write,
2197 php_mysqlnd_ok_read,
2199 php_mysqlnd_ok_free_mem,
2202 php_mysqlnd_eof_read,
2212 php_mysqlnd_rset_header_read,
2214 php_mysqlnd_rset_header_free_mem,
2217 php_mysqlnd_rset_field_read,
2222 php_mysqlnd_rowp_read,
2227 php_mysqlnd_stats_read,
2229 php_mysqlnd_stats_free_mem,
2232 php_mysqlnd_prepare_read,
2237 php_mysqlnd_chg_user_read,
2239 php_mysqlnd_chg_user_free_mem,
2243 php_mysqlnd_sha256_pk_request_write,
2247 php_mysqlnd_sha256_pk_request_response_read,
2249 php_mysqlnd_sha256_pk_request_response_free_mem,
2252 php_mysqlnd_cached_sha2_result_read,
2253 php_mysqlnd_cached_sha2_result_write,
2264 DBG_ENTER(
"mysqlnd_protocol::init_greet_packet");
2265 memset(packet, 0,
sizeof(*packet));
2276 DBG_ENTER(
"mysqlnd_protocol::init_auth_packet");
2277 memset(packet, 0,
sizeof(*packet));
2288 DBG_ENTER(
"mysqlnd_protocol::init_auth_response_packet");
2289 memset(packet, 0,
sizeof(*packet));
2300 DBG_ENTER(
"mysqlnd_protocol::init_change_auth_response_packet");
2301 memset(packet, 0,
sizeof(*packet));
2312 DBG_ENTER(
"mysqlnd_protocol::init_ok_packet");
2313 memset(packet, 0,
sizeof(*packet));
2324 DBG_ENTER(
"mysqlnd_protocol::init_eof_packet");
2325 memset(packet, 0,
sizeof(*packet));
2336 DBG_ENTER(
"mysqlnd_protocol::init_command_packet");
2337 memset(packet, 0,
sizeof(*packet));
2348 DBG_ENTER(
"mysqlnd_protocol::get_rset_header_packet");
2349 memset(packet, 0,
sizeof(*packet));
2360 DBG_ENTER(
"mysqlnd_protocol::init_result_field_packet");
2361 memset(packet, 0,
sizeof(*packet));
2372 DBG_ENTER(
"mysqlnd_protocol::init_row_packet");
2373 memset(packet, 0,
sizeof(*packet));
2384 DBG_ENTER(
"mysqlnd_protocol::init_stats_packet");
2385 memset(packet, 0,
sizeof(*packet));
2396 DBG_ENTER(
"mysqlnd_protocol::init_prepare_response_packet");
2397 memset(packet, 0,
sizeof(*packet));
2408 DBG_ENTER(
"mysqlnd_protocol::init_change_user_response_packet");
2409 memset(packet, 0,
sizeof(*packet));
2420 DBG_ENTER(
"mysqlnd_protocol::init_sha256_pk_request_packet");
2421 memset(packet, 0,
sizeof(*packet));
2432 DBG_ENTER(
"mysqlnd_protocol::init_sha256_pk_request_response_packet");
2433 memset(packet, 0,
sizeof(*packet));
2443 DBG_ENTER(
"mysqlnd_protocol::init_cached_sha2_result_packet");
2444 memset(packet, 0,
sizeof(*packet));
2464 void * send_close_ctx)
2469 DBG_ENTER(
"mysqlnd_protocol::send_command");
2472 DBG_INF_FMT(
"sending %zu bytes", arg_len + 1);
2473 state = connection_state->m->get(connection_state);
2480 DBG_ERR(
"Server is gone");
2484 DBG_ERR_FMT(
"Command out of sync. State=%u",
state);
2491 payload_decoder_factory->m.init_command_packet(&cmd_packet);
2494 if (
arg && arg_len) {
2501 if (!
PACKET_WRITE(payload_decoder_factory->conn, &cmd_packet)) {
2507 send_close(send_close_ctx);
2508 DBG_ERR(
"Server is gone");
2523 const bool ignore_upsert_status,
2529 payload_decoder_factory->m.init_ok_packet(&ok_response);
2530 DBG_ENTER(
"mysqlnd_protocol::send_command_handle_OK");
2533 DBG_INF(
"Error while reading OK packet");
2538 DBG_INF_FMT(
"OK from server");
2556 if (!ignore_upsert_status) {
2568 DBG_INF(
ret ==
PASS ?
"PASS":
"FAIL");
2584 payload_decoder_factory->m.init_eof_packet(&response);
2586 DBG_ENTER(
"mysqlnd_protocol::send_command_handle_EOF");
2589 DBG_INF(
"Error while reading EOF packet");
2593 DBG_INF_FMT(
"Error_no=%d SQLstate=%s Error=%s", response.
error_no, response.
sqlstate, response.
error);
2600 DBG_ERR_FMT(
"EOF packet expected, field count wasn't 0xFE but 0x%2X", response.
field_count);
2603 DBG_INF_FMT(
"EOF from server");
2607 DBG_INF(
ret ==
PASS ?
"PASS":
"FAIL");
2620 const bool ignore_upsert_status,
2629 DBG_ENTER(
"mysqlnd_protocol::send_command_handle_response");
2632 switch (ok_packet) {
2634 ret = payload_decoder_factory->m.send_command_handle_OK(payload_decoder_factory, error_info, upsert_status, ignore_upsert_status, last_message);
2637 ret = payload_decoder_factory->m.send_command_handle_EOF(payload_decoder_factory, error_info, upsert_status);
2647 DBG_INF(
ret ==
PASS ?
"PASS":
"FAIL");
2657 MYSQLND_METHOD(mysqlnd_protocol, init_change_auth_response_packet),
2666 MYSQLND_METHOD(mysqlnd_protocol, init_change_user_response_packet),
2668 MYSQLND_METHOD(mysqlnd_protocol, init_sha256_pk_request_response_packet),
2669 MYSQLND_METHOD(mysqlnd_protocol, init_cached_sha2_result_packet),
2683 DBG_ENTER(
"mysqlnd_protocol_payload_decoder_factory_init");
2694 DBG_ENTER(
"mysqlnd_protocol_payload_decoder_factory_free");
2697 bool pers =
factory->persistent;
header(string $header, bool $replace=true, int $response_code=0)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
const php_stream_filter_factory * factory
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic)
#define MYSQLND_METHOD(class, method)
#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2)
#define mnd_pestrndup(ptr, size, pers)
#define mnd_pestrdup(ptr, pers)
#define mnd_emalloc(size)
#define mnd_pefree(ptr, pers)
PHPAPI const char *const mysqlnd_server_gone
PHPAPI const char *const mysqlnd_out_of_sync
#define SET_CONNECTION_STATE(state_struct, s)
#define UPSERT_STATUS_GET_SERVER_STATUS(status)
#define UPSERT_STATUS_SET_WARNINGS(status, warnings)
#define UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(status)
#define UPSERT_STATUS_SET_LAST_INSERT_ID(status, id)
#define UPSERT_STATUS_RESET(status)
#define UPSERT_STATUS_SET_AFFECTED_ROWS(status, rows)
#define UPSERT_STATUS_SET_SERVER_STATUS(status, server_st)
#define DBG_RETURN(value)
#define CLIENT_SECURE_CONNECTION
#define CR_MALFORMED_PACKET
#define CR_SERVER_GONE_ERROR
#define CLIENT_PLUGIN_AUTH
#define SCRAMBLE_LENGTH_323
@ STAT_TEXT_TYPE_FETCHED_DATETIME
@ STAT_PACKETS_RECEIVED_CHANGE_USER
@ STAT_BYTES_RECEIVED_PURE_DATA_TEXT
@ STAT_PACKETS_RECEIVED_PREPARE_RESPONSE
@ STAT_BINARY_TYPE_FETCHED_DOUBLE
@ STAT_TEXT_TYPE_FETCHED_INT64
@ STAT_CMD_BUFFER_TOO_SMALL
@ STAT_TEXT_TYPE_FETCHED_JSON
@ STAT_BINARY_TYPE_FETCHED_FLOAT
@ STAT_TEXT_TYPE_FETCHED_INT24
@ STAT_TEXT_TYPE_FETCHED_DATE
@ STAT_PACKETS_RECEIVED_RSET_ROW
@ STAT_BINARY_TYPE_FETCHED_OTHER
@ STAT_TEXT_TYPE_FETCHED_TIMESTAMP
@ STAT_BINARY_TYPE_FETCHED_INT16
@ STAT_BINARY_TYPE_FETCHED_SET
@ STAT_TEXT_TYPE_FETCHED_STRING
@ STAT_BYTES_RECEIVED_CHANGE_USER
@ STAT_PACKETS_RECEIVED_RSET_HEADER
@ STAT_BINARY_TYPE_FETCHED_TIMESTAMP
@ STAT_TEXT_TYPE_FETCHED_DOUBLE
@ STAT_TEXT_TYPE_FETCHED_NULL
@ STAT_BINARY_TYPE_FETCHED_INT64
@ STAT_PACKETS_RECEIVED_EOF
@ STAT_BINARY_TYPE_FETCHED_YEAR
@ STAT_TEXT_TYPE_FETCHED_FLOAT
@ STAT_BINARY_TYPE_FETCHED_DECIMAL
@ STAT_BINARY_TYPE_FETCHED_DATETIME
@ STAT_TEXT_TYPE_FETCHED_GEOMETRY
@ STAT_TEXT_TYPE_FETCHED_YEAR
@ STAT_BYTES_RECEIVED_PREPARE_RESPONSE
@ STAT_PACKETS_RECEIVED_OK
@ STAT_TEXT_TYPE_FETCHED_DECIMAL
@ STAT_TEXT_TYPE_FETCHED_BIT
@ STAT_TEXT_TYPE_FETCHED_TIME
@ STAT_TEXT_TYPE_FETCHED_INT8
@ STAT_TEXT_TYPE_FETCHED_INT16
@ STAT_BINARY_TYPE_FETCHED_DATE
@ STAT_BYTES_RECEIVED_RSET_HEADER
@ STAT_BINARY_TYPE_FETCHED_BLOB
@ STAT_ROWS_FETCHED_FROM_SERVER_PS
@ STAT_PROTOCOL_OVERHEAD_IN
@ STAT_BINARY_TYPE_FETCHED_BIT
@ STAT_BINARY_TYPE_FETCHED_TIME
@ STAT_BYTES_RECEIVED_PURE_DATA_PS
@ STAT_BINARY_TYPE_FETCHED_GEOMETRY
@ STAT_PACKETS_RECEIVED_RSET_FIELD_META
@ STAT_TEXT_TYPE_FETCHED_INT32
@ STAT_TEXT_TYPE_FETCHED_ENUM
@ STAT_TEXT_TYPE_FETCHED_OTHER
@ STAT_BYTES_RECEIVED_RSET_FIELD_META
@ STAT_TEXT_TYPE_FETCHED_BLOB
@ STAT_BINARY_TYPE_FETCHED_NULL
@ STAT_BINARY_TYPE_FETCHED_INT8
@ STAT_BINARY_TYPE_FETCHED_ENUM
@ STAT_BYTES_RECEIVED_RSET_ROW
@ STAT_BINARY_TYPE_FETCHED_INT32
@ STAT_BYTES_RECEIVED_EOF
@ STAT_BINARY_TYPE_FETCHED_STRING
@ STAT_ROWS_FETCHED_FROM_SERVER_NORMAL
@ STAT_BINARY_TYPE_FETCHED_INT24
@ STAT_TEXT_TYPE_FETCHED_SET
enum mysqlnd_collected_stats enum_mysqlnd_collected_stats
@ PROT_CHANGE_AUTH_RESP_PACKET
@ PROT_SHA256_PK_REQUEST_RESPONSE_PACKET
@ PROT_CACHED_SHA2_RESULT_PACKET
@ PROT_PREPARE_RESP_PACKET
@ PROT_CHG_USER_RESP_PACKET
@ PROT_SHA256_PK_REQUEST_PACKET
@ PROT_RSET_HEADER_PACKET
#define MYSQLND_MAX_PACKET_SIZE
#define MYSQLND_MAX_ALLOWED_USER_LEN
#define CR_COMMANDS_OUT_OF_SYNC
php_mysqlnd_server_command
#define MYSQLND_SQLSTATE_LENGTH
#define CR_INVALID_BUFFER_USE
#define SERVER_MORE_RESULTS_EXISTS
#define MYSQLND_MAX_ALLOWED_DB_LEN
enum mysqlnd_field_types enum_mysqlnd_field_types
enum func_status enum_func_status
void ps_fetch_from_1_to_8_bytes(zval *zv, const MYSQLND_FIELD *const field, const unsigned int pack_len, const zend_uchar **row, unsigned int byte_count)
struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST+1]
struct st_mysqlnd_field MYSQLND_FIELD
#define MYSQLND_CLASS_METHODS_END
struct st_mysqlnd_vio MYSQLND_VIO
struct st_mysqlnd_upsert_status MYSQLND_UPSERT_STATUS
struct st_mysqlnd_connection_data MYSQLND_CONN_DATA
struct st_mysqlnd_string MYSQLND_STRING
struct st_mysqlnd_const_string MYSQLND_CSTRING
struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL
struct st_mysqlnd_stats MYSQLND_STATS
struct st_mysqlnd_protocol_frame_codec MYSQLND_PFC
struct st_mysqlnd_connection_state MYSQLND_CONNECTION_STATE
struct st_mysqlnd_protocol_payload_decoder_factory MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY
#define SET_EMPTY_ERROR(info)
#define SET_CLIENT_ERROR(info, err_no, sqlstate, error)
struct st_mysqlnd_row_buffer MYSQLND_ROW_BUFFER
enum_func_status(* func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA *conn)
#define MYSQLND_CLASS_METHODS_START(class)
struct st_mysqlnd_error_info MYSQLND_ERROR_INFO
#define MYSQLND_CLASS_METHOD_TABLE_NAME(class)
#define MARIADB_RPL_VERSION_HACK
#define READ_RSET_FIELD(field_name)
enum_func_status php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER *row_buffer, zval *fields, unsigned int field_count, const MYSQLND_FIELD *fields_metadata, bool as_int_or_float, MYSQLND_STATS *stats)
#define BAIL_IF_NO_MORE_DATA
size_t php_mysqlnd_net_store_length_size(uint64_t length)
PHPAPI void mysqlnd_protocol_payload_decoder_factory_free(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY *const factory)
const char mysqlnd_read_body_name[]
#define PREPARE_RESPONSE_SIZE_50
enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_ROW_BUFFER *row_buffer, zval *fields, const unsigned int field_count, const MYSQLND_FIELD *const fields_metadata, const bool as_int_or_float, MYSQLND_STATS *const stats)
const char mysqlnd_read_header_name[]
#define PREPARE_RESPONSE_SIZE_41
PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA *conn, const bool persistent)
size_t php_mysqlnd_cmd_write(MYSQLND_CONN_DATA *conn, void *_packet)
zend_ulong php_mysqlnd_net_field_length(const zend_uchar **packet)
const char *const mysqlnd_command_to_text[COM_END]
const char *const mysqlnd_empty_string
#define AUTH_WRITE_BUFFER_LEN
zend_uchar * php_mysqlnd_net_store_length(zend_uchar *packet, const uint64_t length)
uint64_t php_mysqlnd_net_field_length_ll(const zend_uchar **packet)
struct st_mysqlnd_packet_prepare_response MYSQLND_PACKET_PREPARE_RESPONSE
struct st_mysqlnd_packet_eof MYSQLND_PACKET_EOF
#define PACKET_FREE(packet)
struct st_mysqlnd_packet_res_field MYSQLND_PACKET_RES_FIELD
struct st_mysqlnd_packet_stats MYSQLND_PACKET_STATS
struct st_mysqlnd_packet_command MYSQLND_PACKET_COMMAND
#define PACKET_WRITE(conn, packet)
struct st_mysqlnd_packet_cached_sha2_result MYSQLND_PACKET_CACHED_SHA2_RESULT
struct st_mysqlnd_packet_header MYSQLND_PACKET_HEADER
#define MYSQLND_HEADER_SIZE
struct st_mysqlnd_packet_ok MYSQLND_PACKET_OK
struct st_mysqlnd_packet_rset_header MYSQLND_PACKET_RSET_HEADER
struct st_mysqlnd_packet_sha256_pk_request_response MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE
struct st_mysqlnd_packet_auth MYSQLND_PACKET_AUTH
struct st_mysqlnd_packet_change_auth_response MYSQLND_PACKET_CHANGE_AUTH_RESPONSE
struct st_mysqlnd_packet_auth_response MYSQLND_PACKET_AUTH_RESPONSE
struct st_mysqlnd_packet_greet MYSQLND_PACKET_GREET
#define MYSQLND_NULL_LENGTH
#define PACKET_READ(conn, packet)
struct st_mysqlnd_packet_row MYSQLND_PACKET_ROW
struct st_mysqlnd_packet_chg_user_resp MYSQLND_PACKET_CHG_USER_RESPONSE
struct st_mysqlnd_packet_methods mysqlnd_packet_methods
unsigned const char * end
unsigned char key[REFLECTION_KEY_LEN]
MYSQLND_ERROR_INFO * error_info
MYSQLND_PFC * protocol_frame_codec
MYSQLND_CONNECTION_STATE state
char sqlstate[MYSQLND_SQLSTATE_LENGTH+1]
char error[MYSQLND_ERRMSG_SIZE+1]
unsigned int org_table_length
unsigned int org_name_length
enum mysqlnd_field_types type
unsigned int catalog_length
unsigned int table_length
void *(* get_chunk)(MYSQLND_MEMORY_POOL *pool, size_t size)
bool is_change_user_packet
const zend_uchar * auth_data
const char * auth_plugin_name
zend_uchar * new_auth_protocol_data
size_t new_auth_protocol_data_len
size_t new_auth_protocol_len
MYSQLND_PACKET_HEADER header
char sqlstate[MYSQLND_SQLSTATE_LENGTH+1]
char error[MYSQLND_ERRMSG_SIZE+1]
MYSQLND_PACKET_HEADER header
const zend_uchar * auth_data
enum php_mysqlnd_server_command command
char error[MYSQLND_ERRMSG_SIZE+1]
char sqlstate[MYSQLND_SQLSTATE_LENGTH+1]
char sqlstate[MYSQLND_SQLSTATE_LENGTH+1]
char error[MYSQLND_ERRMSG_SIZE+1]
unsigned int warning_count
MYSQLND_PACKET_HEADER header
MYSQLND_ERROR_INFO error_info
MYSQLND_MEMORY_POOL * memory_pool
MYSQLND_PACKET_HEADER header
MYSQLND_ERROR_INFO error_info
MYSQLND_PACKET_HEADER header
MYSQLND_ROW_BUFFER row_buffer
MYSQLND_ERROR_INFO error_info
MYSQLND_MEMORY_POOL * result_set_memory_pool
MYSQLND_CMD_BUFFER cmd_buffer
struct st_mysqlnd_protocol_frame_codec_data * data
struct st_mysqlnd_vio_data * data
#define ZVAL_STRINGL(z, s, l)
#define ZVAL_STRINGL_FAST(z, s, l)
#define erealloc(ptr, size)
strncmp(string $string1, string $string2, int $length)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val)
struct _zend_string zend_string
#define ALLOCA_FLAG(name)
#define EXPECTED(condition)
#define do_alloca(p, use_heap)
#define free_alloca(p, use_heap)
#define UNEXPECTED(condition)
ZEND_API zend_string_init_interned_func_t zend_string_init_interned
#define ZSTR_EMPTY_ALLOC()
ZEND_API double zend_strtod(const char *s00, const char **se)
#define Z_STRVAL_P(zval_p)
#define Z_STRLEN_P(zval_p)
#define ZVAL_DOUBLE(z, d)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)