summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-10-29 10:39:58 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-10-29 10:39:58 +0100
commitd784c65cca34e55e52887bfa4975594958f28181 (patch)
tree55155bddeb121e9962d5ecce6fe0d1bf6c8bd4b2
parent246b8b20b2cbed5ce8f5e88e9b50b7f387f0ebb7 (diff)
parent24537a73c010d5ce56d83cae36c15b9c8d1a1a13 (diff)
downloadphp-git-d784c65cca34e55e52887bfa4975594958f28181.tar.gz
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Retain QUIT_SEND connection state
-rw-r--r--ext/mysqlnd/mysqlnd_ps.c4
-rw-r--r--ext/mysqlnd/mysqlnd_result.c8
-rw-r--r--ext/mysqlnd/mysqlnd_wireprotocol.c5
3 files changed, 13 insertions, 4 deletions
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c
index 274924c2a3..38e19484da 100644
--- a/ext/mysqlnd/mysqlnd_ps.c
+++ b/ext/mysqlnd/mysqlnd_ps.c
@@ -886,7 +886,9 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi
COPY_CLIENT_ERROR(stmt->error_info, row_packet->error_info);
}
}
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
+ SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ }
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
} else if (row_packet->eof) {
DBG_INF("EOF");
diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c
index 08f458ec2b..28761aeb0a 100644
--- a/ext/mysqlnd/mysqlnd_result.c
+++ b/ext/mysqlnd/mysqlnd_result.c
@@ -741,7 +741,9 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row_c)(MYSQLND_RES * result, voi
COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
}
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
+ SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ }
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
} else if (row_packet->eof) {
/* Mark the connection as usable again */
@@ -879,7 +881,9 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void
COPY_CLIENT_ERROR(conn->error_info, row_packet->error_info);
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
}
- SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ if (GET_CONNECTION_STATE(&conn->state) != CONN_QUIT_SENT) {
+ SET_CONNECTION_STATE(&conn->state, CONN_READY);
+ }
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */
} else if (row_packet->eof) {
/* Mark the connection as usable again */
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c
index 44bf2d9c40..5bd90e86dd 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -1367,6 +1367,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
MYSQLND_VIO * vio,
MYSQLND_STATS * stats,
MYSQLND_ERROR_INFO * error_info,
+ MYSQLND_CONNECTION_STATE * connection_state,
MYSQLND_MEMORY_POOL * pool,
MYSQLND_ROW_BUFFER * buffer,
size_t * const data_size)
@@ -1402,6 +1403,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
if (UNEXPECTED(PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info)))) {
DBG_ERR("Empty row packet body");
+ SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
} else {
while (header.size >= MYSQLND_MAX_PACKET_SIZE) {
@@ -1431,6 +1433,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
if (PASS != (ret = pfc->data->m.receive(pfc, vio, p, header.size, stats, error_info))) {
DBG_ERR("Empty row packet body");
+ SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
set_packet_error(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
break;
}
@@ -1733,7 +1736,7 @@ php_mysqlnd_rowp_read(MYSQLND_CONN_DATA * conn, void * _packet)
DBG_ENTER("php_mysqlnd_rowp_read");
- ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info,
+ ret = php_mysqlnd_read_row_ex(pfc, vio, stats, error_info, &conn->state,
packet->result_set_memory_pool, &packet->row_buffer, &data_size);
if (FAIL == ret) {
goto end;