From 6fd03067514f1d9ceb288d75d6e98c343575a8cb Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Mon, 7 Mar 2022 12:39:57 +0000 Subject: [PATCH] Fix regression from #8058 --- ext/mysqlnd/mysqlnd_ps.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 1eac55a03fc89..cdbffbe2f54a2 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -391,7 +391,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s) /* {{{ mysqlnd_stmt::prepare */ static enum_func_status -MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query, const size_t query_len) +MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, const size_t query_len) { MYSQLND_STMT_DATA * stmt = s? s->data : NULL; MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL; @@ -413,12 +413,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query /* Create a new prepared statement and destroy the previous one. */ - s->m->dtor(s, TRUE); - s = conn->m->stmt_init(conn); - if (!s) { + MYSQLND_STMT * s_to_prepare = conn->m->stmt_init(conn); + if (!s_to_prepare) { goto fail; } - stmt = s->data; + MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare->data; + + /* swap */ + size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + char * tmp_swap = mnd_malloc(real_size); + memcpy(tmp_swap, s, real_size); + memcpy(s, s_to_prepare, real_size); + memcpy(s_to_prepare, tmp_swap, real_size); + mnd_free(tmp_swap); + { + MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare; + stmt_to_prepare = stmt; + stmt = tmp_swap_data; + } + s_to_prepare->m->dtor(s_to_prepare, TRUE); } {