diff options
author | Andrey Hristov <andrey@php.net> | 2009-09-18 10:49:31 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2009-09-18 10:49:31 +0000 |
commit | 8aae3baa45a02a3815a1e7b6ecc79ae2b516ceff (patch) | |
tree | 24da10d4e5ab0dc04bf3713b844f04c2da72bafa /ext/mysql/php_mysql.c | |
parent | c2e66884e11fdcdfb5247698b92a1ebca7f79056 (diff) | |
download | php-git-8aae3baa45a02a3815a1e7b6ecc79ae2b516ceff.tar.gz |
MFH:Fix for bug#48754 mysql_close() crash php when no handle specified
Diffstat (limited to 'ext/mysql/php_mysql.c')
-rw-r--r-- | ext/mysql/php_mysql.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 53c6edd637..aaee07bc6a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -971,6 +971,7 @@ PHP_FUNCTION(mysql_pconnect) Close a MySQL connection */ PHP_FUNCTION(mysql_close) { + int resource_id; zval *mysql_link=NULL; php_mysql_conn *mysql; @@ -984,24 +985,25 @@ PHP_FUNCTION(mysql_close) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, NULL, MySG(default_link), "MySQL-Link", le_link, le_plink); } + resource_id = mysql_link ? Z_RESVAL_P(mysql_link) : MySG(default_link); + PHPMY_UNBUFFERED_QUERY_CHECK(); #ifdef MYSQL_USE_MYSQLND { int tmp; - if ((mysql = zend_list_find(Z_RESVAL_P(mysql_link), &tmp)) && tmp == le_plink) { + if ((mysql = zend_list_find(resource_id, &tmp)) && tmp == le_plink) { mysqlnd_end_psession(mysql->conn); } } #endif - if (mysql_link) { /* explicit resource number */ - PHPMY_UNBUFFERED_QUERY_CHECK(); - zend_list_delete(Z_RESVAL_P(mysql_link)); - } + zend_list_delete(resource_id); if (!mysql_link || (mysql_link && Z_RESVAL_P(mysql_link)==MySG(default_link))) { - PHPMY_UNBUFFERED_QUERY_CHECK(); - zend_list_delete(MySG(default_link)); MySG(default_link) = -1; + if (mysql_link) { + /* on an explicit close of the default connection it had a refcount of 2 so we need one more call */ + zend_list_delete(resource_id); + } } RETURN_TRUE; |