Patch 0001-mysqlnd-last_message-needs-to-respect-conn-persistent.txt for PDO MySQL Bug #77289
Patch version 2019-01-06 20:08 UTC
Return to Bug #77289 |
Download this patch
Patch Revisions:
Developer: lauri.kentta@gmail.com
From e21de6e5e6ff75a9bba6cadb68b4f4187d79626b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lauri=20Kentt=C3=A4?= <lauri.kentta@gmail.com>
Date: Sun, 6 Jan 2019 22:02:34 +0200
Subject: [PATCH] mysqlnd: last_message needs to respect conn->persistent
---
ext/mysqlnd/mysqlnd_auth.c | 2 +-
ext/mysqlnd/mysqlnd_commands.c | 16 ++++++++--------
ext/mysqlnd/mysqlnd_connection.c | 4 ++--
ext/mysqlnd/mysqlnd_connection.h | 10 +++++-----
ext/mysqlnd/mysqlnd_loaddata.c | 3 ++-
ext/mysqlnd/mysqlnd_result.c | 4 ++--
ext/mysqlnd/mysqlnd_structs.h | 6 ++++--
ext/mysqlnd/mysqlnd_wireprotocol.c | 10 ++++++----
8 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/ext/mysqlnd/mysqlnd_auth.c b/ext/mysqlnd/mysqlnd_auth.c
index fa04e1b831..6288b196d1 100644
--- a/ext/mysqlnd/mysqlnd_auth.c
+++ b/ext/mysqlnd/mysqlnd_auth.c
@@ -352,7 +352,7 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
goto end;
}
- SET_NEW_MESSAGE(conn->last_message.s, conn->last_message.l, auth_resp_packet.message, auth_resp_packet.message_len);
+ SET_NEW_MESSAGE(conn->last_message.s, conn->last_message.l, auth_resp_packet.message, auth_resp_packet.message_len, conn->persistent);
ret = PASS;
end:
PACKET_FREE(&auth_resp_packet);
diff --git a/ext/mysqlnd/mysqlnd_commands.c b/ext/mysqlnd/mysqlnd_commands.c
index 21b95a8f57..1eedbf60e8 100644
--- a/ext/mysqlnd/mysqlnd_commands.c
+++ b/ext/mysqlnd/mysqlnd_commands.c
@@ -71,7 +71,7 @@ mysqlnd_com_set_option_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_SET_OPTION, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
DBG_RETURN(ret);
}
@@ -118,7 +118,7 @@ mysqlnd_com_debug_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_EOF_PACKET, FALSE, COM_DEBUG, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
DBG_RETURN(ret);
@@ -176,7 +176,7 @@ mysqlnd_com_init_db_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_INIT_DB, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
/*
@@ -242,7 +242,7 @@ mysqlnd_com_ping_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, TRUE, COM_PING, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
/*
The server sends 0 but libmysql doesn't read it and has established
@@ -373,7 +373,7 @@ mysqlnd_com_process_kill_run(void *cmd)
conn);
if (PASS == ret && read_response) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_PROCESS_KILL, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
if (read_response) {
@@ -444,7 +444,7 @@ mysqlnd_com_refresh_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_REFRESH, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
DBG_RETURN(ret);
@@ -504,7 +504,7 @@ mysqlnd_com_shutdown_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_SHUTDOWN, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
DBG_RETURN(ret);
@@ -933,7 +933,7 @@ mysqlnd_com_stmt_reset_run(void *cmd)
conn);
if (PASS == ret) {
ret = send_command_handle_response(conn->payload_decoder_factory, PROT_OK_PACKET, FALSE, COM_STMT_RESET, TRUE,
- conn->error_info, conn->upsert_status, &conn->last_message);
+ conn->error_info, conn->upsert_status, &conn->last_message, conn->persistent);
}
DBG_RETURN(ret);
diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c
index a361361818..63dd13c8b0 100644
--- a/ext/mysqlnd/mysqlnd_connection.c
+++ b/ext/mysqlnd/mysqlnd_connection.c
@@ -318,7 +318,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn)
conn->authentication_plugin_data.s = NULL;
}
if (conn->last_message.s) {
- mnd_efree(conn->last_message.s);
+ mnd_pefree(conn->last_message.s, conn->persistent);
conn->last_message.s = NULL;
}
@@ -411,7 +411,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, end_psession)(MYSQLND_CONN_DATA * conn)
conn->current_result = NULL;
}
if (conn->last_message.s) {
- mnd_efree(conn->last_message.s);
+ mnd_pefree(conn->last_message.s, conn->persistent);
conn->last_message.s = NULL;
}
conn->error_info = &conn->error_info_impl;
diff --git a/ext/mysqlnd/mysqlnd_connection.h b/ext/mysqlnd/mysqlnd_connection.h
index a5c07c3af6..a84fee915f 100644
--- a/ext/mysqlnd/mysqlnd_connection.h
+++ b/ext/mysqlnd/mysqlnd_connection.h
@@ -44,23 +44,23 @@ void mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS * const upsert_status);
/* Error handling */
-#define SET_NEW_MESSAGE(buf, buf_len, message, len) \
+#define SET_NEW_MESSAGE(buf, buf_len, message, len, persistent) \
{\
if ((buf)) { \
- mnd_efree((buf)); \
+ mnd_pefree((buf), persistent); \
} \
if ((message)) { \
- (buf) = mnd_pestrndup((message), (len), 0); \
+ (buf) = mnd_pestrndup((message), (len), persistent); \
} else { \
(buf) = NULL; \
} \
(buf_len) = (len); \
}
-#define SET_EMPTY_MESSAGE(buf, buf_len) \
+#define SET_EMPTY_MESSAGE(buf, buf_len, persistent) \
{\
if ((buf)) { \
- mnd_efree((buf)); \
+ mnd_pefree((buf), persistent); \
(buf) = NULL; \
} \
(buf_len) = 0; \
diff --git a/ext/mysqlnd/mysqlnd_loaddata.c b/ext/mysqlnd/mysqlnd_loaddata.c
index a77961717d..33d5e2397f 100644
--- a/ext/mysqlnd/mysqlnd_loaddata.c
+++ b/ext/mysqlnd/mysqlnd_loaddata.c
@@ -216,7 +216,8 @@ infile_error:
PROT_OK_PACKET, FALSE, COM_QUERY, FALSE,
conn->error_info,
conn->upsert_status,
- &conn->last_message)) {
+ &conn->last_message,
+ conn->persistent)) {
result = FAIL;
}
diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c
index 38fe116686..a6e514c32e 100644
--- a/ext/mysqlnd/mysqlnd_result.c
+++ b/ext/mysqlnd/mysqlnd_result.c
@@ -440,7 +440,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
UPSERT_STATUS_SET_AFFECTED_ROWS(conn->upsert_status, rset_header.affected_rows);
UPSERT_STATUS_SET_LAST_INSERT_ID(conn->upsert_status, rset_header.last_insert_id);
SET_NEW_MESSAGE(conn->last_message.s, conn->last_message.l,
- rset_header.info_or_local_file.s, rset_header.info_or_local_file.l);
+ rset_header.info_or_local_file.s, rset_header.info_or_local_file.l, conn->persistent);
/* Result set can follow UPSERT statement, check server_status */
if (UPSERT_STATUS_GET_SERVER_STATUS(conn->upsert_status) & SERVER_MORE_RESULTS_EXISTS) {
SET_CONNECTION_STATE(&conn->state, CONN_NEXT_RESULT_PENDING);
@@ -455,7 +455,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
enum_mysqlnd_collected_stats statistic = STAT_LAST;
DBG_INF("Result set pending");
- SET_EMPTY_MESSAGE(conn->last_message.s, conn->last_message.l);
+ SET_EMPTY_MESSAGE(conn->last_message.s, conn->last_message.l, conn->persistent);
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY);
UPSERT_STATUS_RESET(conn->upsert_status);
diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h
index 58f9e71e6a..3ade4c688f 100644
--- a/ext/mysqlnd/mysqlnd_structs.h
+++ b/ext/mysqlnd/mysqlnd_structs.h
@@ -1007,7 +1007,8 @@ typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_c
MYSQLND_ERROR_INFO * const error_info,
MYSQLND_UPSERT_STATUS * const upsert_status,
const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
- MYSQLND_STRING * const last_message);
+ MYSQLND_STRING * const last_message,
+ int persistent);
typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_EOF)(
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory,
@@ -1023,7 +1024,8 @@ typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_c
MYSQLND_ERROR_INFO * error_info,
MYSQLND_UPSERT_STATUS * upsert_status,
- MYSQLND_STRING * last_message);
+ MYSQLND_STRING * last_message,
+ int persistent);
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory)
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c
index 1b7f4a935e..6a147fe512 100644
--- a/ext/mysqlnd/mysqlnd_wireprotocol.c
+++ b/ext/mysqlnd/mysqlnd_wireprotocol.c
@@ -2544,7 +2544,8 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_OK)(
MYSQLND_ERROR_INFO * const error_info,
MYSQLND_UPSERT_STATUS * const upsert_status,
const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
- MYSQLND_STRING * const last_message)
+ MYSQLND_STRING * const last_message,
+ int persistent)
{
enum_func_status ret = FAIL;
MYSQLND_PACKET_OK ok_response;
@@ -2574,7 +2575,7 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_OK)(
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(upsert_status);
} else {
SET_NEW_MESSAGE(last_message->s, last_message->l,
- ok_response.message, ok_response.message_len);
+ ok_response.message, ok_response.message_len, persistent);
if (!ignore_upsert_status) {
UPSERT_STATUS_RESET(upsert_status);
UPSERT_STATUS_SET_WARNINGS(upsert_status, ok_response.warning_count);
@@ -2643,7 +2644,8 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)(
MYSQLND_ERROR_INFO * error_info,
MYSQLND_UPSERT_STATUS * upsert_status,
- MYSQLND_STRING * last_message
+ MYSQLND_STRING * last_message,
+ int persistent
)
{
enum_func_status ret = FAIL;
@@ -2653,7 +2655,7 @@ MYSQLND_METHOD(mysqlnd_protocol, send_command_handle_response)(
switch (ok_packet) {
case PROT_OK_PACKET:
- ret = payload_decoder_factory->m.send_command_handle_OK(payload_decoder_factory, error_info, upsert_status, ignore_upsert_status, last_message);
+ ret = payload_decoder_factory->m.send_command_handle_OK(payload_decoder_factory, error_info, upsert_status, ignore_upsert_status, last_message, persistent);
break;
case PROT_EOF_PACKET:
ret = payload_decoder_factory->m.send_command_handle_EOF(payload_decoder_factory, error_info, upsert_status);
--
2.20.1
|