Skip to content

Commit 74ba88e

Browse files
committed
Fix for Bug #66141 (mysqlnd quote function is wrong with NO_BACKSLASH_ESCAPES after failed query)
1 parent 1b0e606 commit 74ba88e

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ PHP NEWS
1818
- mysqlnd:
1919
. Fixed bug #66124 (mysqli under mysqlnd loses precision when bind_param
2020
with 'i'). (Andrey)
21+
. Fixed bug #66141 (mysqlnd quote function is wrong with NO_BACKSLASH_ESCAPES
22+
after failed query). (Andrey)
2123

2224
- PDO
2325
. Fixed bug 65946 (sql_parser permanently converts values bound to strings)

ext/mysqlnd/mysqlnd.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, simple_command_handle_response)(MYSQLND_CONN_D
251251
conn->persistent);
252252

253253
if (!ignore_upsert_status) {
254+
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
254255
conn->upsert_status->warning_count = ok_response->warning_count;
255256
conn->upsert_status->server_status = ok_response->server_status;
256257
conn->upsert_status->affected_rows = ok_response->affected_rows;
@@ -314,6 +315,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, simple_command)(MYSQLND_CONN_DATA * conn, enum
314315

315316
DBG_ENTER("mysqlnd_conn_data::simple_command");
316317
DBG_INF_FMT("command=%s ok_packet=%u silent=%u", mysqlnd_command_to_text[command], ok_packet, silent);
318+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
317319

318320
switch (CONN_GET_STATE(conn)) {
319321
case CONN_READY:
@@ -328,10 +330,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, simple_command)(MYSQLND_CONN_DATA * conn, enum
328330
DBG_RETURN(FAIL);
329331
}
330332

331-
/* clean UPSERT info */
332-
if (!ignore_upsert_status) {
333-
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
334-
}
335333
SET_ERROR_AFF_ROWS(conn);
336334
SET_EMPTY_ERROR(*conn->error_info);
337335

@@ -888,6 +886,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn,
888886
conn->max_packet_size = MYSQLND_ASSEMBLED_PACKET_MAX_SIZE;
889887
/* todo: check if charset is available */
890888
conn->server_capabilities = greet_packet->server_capabilities;
889+
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
891890
conn->upsert_status->warning_count = 0;
892891
conn->upsert_status->server_status = greet_packet->server_status;
893892
conn->upsert_status->affected_rows = 0;
@@ -1064,6 +1063,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_query)(MYSQLND_CONN_DATA * conn, const ch
10641063
enum_func_status ret = FAIL;
10651064
DBG_ENTER("mysqlnd_conn_data::send_query");
10661065
DBG_INF_FMT("conn=%llu query=%s", conn->thread_id, query);
1066+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
10671067

10681068
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
10691069
ret = conn->m->simple_command(conn, COM_QUERY, (zend_uchar *) query, query_len,
@@ -1074,6 +1074,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, send_query)(MYSQLND_CONN_DATA * conn, const ch
10741074
}
10751075
conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);
10761076
}
1077+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
10771078
DBG_RETURN(ret);
10781079
}
10791080
/* }}} */
@@ -1089,6 +1090,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, reap_query)(MYSQLND_CONN_DATA * conn TSRMLS_DC
10891090
DBG_ENTER("mysqlnd_conn_data::reap_query");
10901091
DBG_INF_FMT("conn=%llu", conn->thread_id);
10911092

1093+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
10921094
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
10931095
if (state <= CONN_READY || state == CONN_QUIT_SENT) {
10941096
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection not opened, clear or has been closed");
@@ -1099,6 +1101,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, reap_query)(MYSQLND_CONN_DATA * conn TSRMLS_DC
10991101

11001102
conn->m->local_tx_end(conn, this_func, ret TSRMLS_CC);
11011103
}
1104+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
11021105
DBG_RETURN(ret);
11031106
}
11041107
/* }}} */
@@ -1477,6 +1480,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, escape_string)(MYSQLND_CONN_DATA * const conn,
14771480
DBG_INF_FMT("conn=%llu", conn->thread_id);
14781481

14791482
if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) {
1483+
DBG_INF_FMT("server_status=%u", conn->upsert_status->server_status);
14801484
if (conn->upsert_status->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) {
14811485
ret = mysqlnd_cset_escape_quotes(conn->charset, newstr, escapestr, escapestr_len TSRMLS_CC);
14821486
} else {

ext/mysqlnd/mysqlnd_ps.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ mysqlnd_stmt_execute_parse_response(MYSQLND_STMT * const s TSRMLS_DC)
485485
ret = mysqlnd_query_read_result_set_header(stmt->conn, s TSRMLS_CC);
486486
if (ret == FAIL) {
487487
COPY_CLIENT_ERROR(*stmt->error_info, *conn->error_info);
488+
memset(stmt->upsert_status, 0, sizeof(*stmt->upsert_status));
488489
stmt->upsert_status->affected_rows = conn->upsert_status->affected_rows;
489490
if (CONN_GET_STATE(conn) == CONN_QUIT_SENT) {
490491
/* close the statement here, the connection has been closed */
@@ -913,6 +914,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
913914
DBG_INF("EOF");
914915
/* Mark the connection as usable again */
915916
result->unbuf->eof_reached = TRUE;
917+
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
916918
result->conn->upsert_status->warning_count = row_packet->warning_count;
917919
result->conn->upsert_status->server_status = row_packet->server_status;
918920
/*
@@ -1022,6 +1024,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
10221024

10231025
row_packet->skip_extraction = stmt->result_bind? FALSE:TRUE;
10241026

1027+
memset(stmt->upsert_status, 0, sizeof(*stmt->upsert_status));
10251028
if (PASS == (ret = PACKET_READ(row_packet, result->conn)) && !row_packet->eof) {
10261029
unsigned int i, field_count = result->field_count;
10271030

ext/mysqlnd/mysqlnd_result.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s
426426
DBG_INF("UPSERT");
427427
conn->last_query_type = QUERY_UPSERT;
428428
conn->field_count = rset_header->field_count;
429+
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
429430
conn->upsert_status->warning_count = rset_header->warning_count;
430431
conn->upsert_status->server_status = rset_header->server_status;
431432
conn->upsert_status->affected_rows = rset_header->affected_rows;
@@ -714,6 +715,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
714715
/* Mark the connection as usable again */
715716
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
716717
result->unbuf->eof_reached = TRUE;
718+
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
717719
result->conn->upsert_status->warning_count = row_packet->warning_count;
718720
result->conn->upsert_status->server_status = row_packet->server_status;
719721
/*
@@ -849,6 +851,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
849851
/* Mark the connection as usable again */
850852
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
851853
result->unbuf->eof_reached = TRUE;
854+
memset(result->conn->upsert_status, 0, sizeof(*result->conn->upsert_status));
852855
result->conn->upsert_status->warning_count = row_packet->warning_count;
853856
result->conn->upsert_status->server_status = row_packet->server_status;
854857
/*
@@ -1206,6 +1209,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const c
12061209

12071210
/* Finally clean */
12081211
if (row_packet->eof) {
1212+
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
12091213
conn->upsert_status->warning_count = row_packet->warning_count;
12101214
conn->upsert_status->server_status = row_packet->server_status;
12111215
}

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,7 @@ php_mysqlnd_ok_read(void * _packet, MYSQLND_CONN_DATA * conn TSRMLS_DC)
763763
packet->error, sizeof(packet->error),
764764
&packet->error_no, packet->sqlstate
765765
TSRMLS_CC);
766+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
766767
DBG_RETURN(PASS);
767768
}
768769
/* Everything was fine! */
@@ -1005,6 +1006,7 @@ php_mysqlnd_rset_header_read(void * _packet, MYSQLND_CONN_DATA * conn TSRMLS_DC)
10051006
packet->error_info.error, sizeof(packet->error_info.error),
10061007
&packet->error_info.error_no, packet->error_info.sqlstate
10071008
TSRMLS_CC);
1009+
DBG_INF_FMT("conn->server_status=%u", conn->upsert_status->server_status);
10081010
DBG_RETURN(PASS);
10091011
}
10101012

0 commit comments

Comments
 (0)