Use mysqlnd_restart_psession and mysqlnd_end_psession in PDO MySQL.
This makes sure we free last_message while ZMM is still live.
. Fixed bug #77273 (array_walk_recursive corrupts value types leading to PDO
failure). (Nikita)
+- PDO MySQL:
+ . Fixed bug #77289 (PDO MySQL segfaults with persistent connection).
+ (Lauri Kenttä)
+
- Phar:
. Fixed bug #77247 (heap buffer overflow in phar_detect_phar_fname_ext). (Stas)
}
/* }}} */
+/* {{{ pdo_mysql_request_shutdown */
+static void pdo_mysql_request_shutdown(pdo_dbh_t *dbh)
+{
+ pdo_mysql_db_handle *H = (pdo_mysql_db_handle *)dbh->driver_data;
+
+ PDO_DBG_ENTER("pdo_mysql_request_shutdown");
+ PDO_DBG_INF_FMT("dbh=%p", dbh);
+#ifdef PDO_USE_MYSQLND
+ if (H->server) {
+ mysqlnd_end_psession(H->server);
+ }
+#endif
+}
+/* }}} */
+
/* {{{ mysql_methods */
static const struct pdo_dbh_methods mysql_methods = {
mysql_handle_closer,
pdo_mysql_get_attribute,
pdo_mysql_check_liveness,
NULL,
- NULL,
+ pdo_mysql_request_shutdown,
NULL
};
/* }}} */
pdo_mysql_error(dbh);
goto cleanup;
}
+#if defined(PDO_USE_MYSQLND)
+ if (dbh->is_persistent) {
+ mysqlnd_restart_psession(H->server);
+ }
+#endif
dbh->driver_data = H;
--- /dev/null
+--TEST--
+Bug #77289: PDO MySQL segfaults with persistent connection
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+
+$dsn = MySQLPDOTest::getDSN();
+$user = PDO_MYSQL_TEST_USER;
+$pass = PDO_MYSQL_TEST_PASS;
+$pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_PERSISTENT => true]);
+$pdo->exec("DROP TABLE IF EXISTS bug77289");
+$pdo->exec("CREATE TEMPORARY TABLE bug77289 (x INT)");
+$pdo->exec("UPDATE bug77289 SET x = x");
+
+?>
+===DONE===
+--EXPECT--
+===DONE===