Skip to content

Commit 6fd0306

Browse files
committed
Fix regression from #8058
1 parent cf83bdd commit 6fd0306

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

ext/mysqlnd/mysqlnd_ps.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
391391

392392
/* {{{ mysqlnd_stmt::prepare */
393393
static enum_func_status
394-
MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query, const size_t query_len)
394+
MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, const size_t query_len)
395395
{
396396
MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
397397
MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL;
@@ -413,12 +413,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
413413
/*
414414
Create a new prepared statement and destroy the previous one.
415415
*/
416-
s->m->dtor(s, TRUE);
417-
s = conn->m->stmt_init(conn);
418-
if (!s) {
416+
MYSQLND_STMT * s_to_prepare = conn->m->stmt_init(conn);
417+
if (!s_to_prepare) {
419418
goto fail;
420419
}
421-
stmt = s->data;
420+
MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare->data;
421+
422+
/* swap */
423+
size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *);
424+
char * tmp_swap = mnd_malloc(real_size);
425+
memcpy(tmp_swap, s, real_size);
426+
memcpy(s, s_to_prepare, real_size);
427+
memcpy(s_to_prepare, tmp_swap, real_size);
428+
mnd_free(tmp_swap);
429+
{
430+
MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare;
431+
stmt_to_prepare = stmt;
432+
stmt = tmp_swap_data;
433+
}
434+
s_to_prepare->m->dtor(s_to_prepare, TRUE);
422435
}
423436

424437
{

0 commit comments

Comments
 (0)