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] and...@php.net

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

Reply via email to