Edit report at https://bugs.php.net/bug.php?id=62730&edit=1
ID: 62730
Comment by: slangley at google dot com
Reported by: slangley at google dot com
Summary: mysqlnd mysqlnd_conn_methods table is mot restored
correctly with mutliple init
Status: Open
Type: Bug
Package: MySQL related
Operating System: N/A
PHP Version: 5.3.15
Block user comment: N
Private report: N
New Comment:
For whatever reason I can't use "edit" as it wont accept my password - ho hum.
----
We have our own SAPI.
FWIW I don't think this is an issue anymore on 5.4+ so you can close this bug.
Previous Comments:
------------------------------------------------------------------------
[2013-03-08 15:08:44] [email protected]
It was never meant to restore the tables after mshutdown because after that the
SAPI usually closes the process. Which SAPI do you use? Embedded?
------------------------------------------------------------------------
[2012-08-03 00:45:16] slangley at google dot com
Description:
------------
If a plugin alters the connection methods table, then the original connection
table is not restored if there is a php_module_shutdown()/php_module_init()
cycle
in the same process.
This is because mysqlnd_conn_methods is a pointer to
MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn), sizeof(mysqlnd_conn_methods)) so
changing the values in mysqlnd_conn_methods actually changes the values in the
master table.
To fix, mysqlnd_conn_methods should take a copy of the table on init.
Test script:
---------------
Create a plugin that replaces the conenct function with a function that simply
flows the call to the original callback.
static enum_func_status
MYSQLND_METHOD(my_test_plugin, query)(MYSQLND* conn,
const char* query, unsigned int query_len TSRMLS_DC) {
return original_conn_methods.query(conn, query, query_len);
}
Register this plugin during MINIT
struct st_mysqlnd_conn_methods* current_conn_methods =
mysqlnd_conn_get_methods();
memcpy(&original_conn_methods,
current_conn_methods,
sizeof(st_mysqlnd_conn_methods));
current_conn_methods->connect = MYSQLND_METHOD(speckle_mysqlnd_conn, connect);
Start/Stop/Start the php modules
php_module_startup(...)
php_module_shutdown(...)
php_module_startup(...)
Try and connect to the mysqldb - you'll get a stack overflow.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62730&edit=1