Skip to content

Commit 40b20d8

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fix regression from #8058
2 parents 7e8dcda + 06e383b commit 40b20d8

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
@@ -369,7 +369,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
369369

370370
/* {{{ mysqlnd_stmt::prepare */
371371
static enum_func_status
372-
MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query, const size_t query_len)
372+
MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const query, const size_t query_len)
373373
{
374374
MYSQLND_STMT_DATA * stmt = s? s->data : NULL;
375375
MYSQLND_CONN_DATA * conn = stmt? stmt->conn : NULL;
@@ -391,12 +391,25 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * s, const char * const query
391391
/*
392392
Create a new prepared statement and destroy the previous one.
393393
*/
394-
s->m->dtor(s, TRUE);
395-
s = conn->m->stmt_init(conn);
396-
if (!s) {
394+
MYSQLND_STMT * s_to_prepare = conn->m->stmt_init(conn);
395+
if (!s_to_prepare) {
397396
goto fail;
398397
}
399-
stmt = s->data;
398+
MYSQLND_STMT_DATA * stmt_to_prepare = s_to_prepare->data;
399+
400+
/* swap */
401+
size_t real_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *);
402+
char * tmp_swap = mnd_malloc(real_size);
403+
memcpy(tmp_swap, s, real_size);
404+
memcpy(s, s_to_prepare, real_size);
405+
memcpy(s_to_prepare, tmp_swap, real_size);
406+
mnd_free(tmp_swap);
407+
{
408+
MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare;
409+
stmt_to_prepare = stmt;
410+
stmt = tmp_swap_data;
411+
}
412+
s_to_prepare->m->dtor(s_to_prepare, TRUE);
400413
}
401414

402415
{

0 commit comments

Comments
 (0)