andrey Thu, 13 May 2010 11:05:09 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=299335
Log: Better fix for #51605 Bug: http://bugs.php.net/51605 (Closed) Mysqli - zombie links Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqli/mysqli.c U php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c U php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c U php/php-src/branches/PHP_5_3/ext/mysqli/php_mysqli_structs.h U php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug51605.phpt U php/php-src/trunk/ext/mysqli/mysqli.c U php/php-src/trunk/ext/mysqli/mysqli_api.c U php/php-src/trunk/ext/mysqli/mysqli_nonapi.c U php/php-src/trunk/ext/mysqli/tests/bug51605.phpt
Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -222,10 +222,11 @@ if (my_res && my_res->ptr) { MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr; if (mysql->mysql) { - php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT, my_res->status TSRMLS_CC); } php_clear_mysql(mysql); efree(mysql); + my_res->status = MYSQLI_STATUS_UNKNOWN; } mysqli_objects_free_storage(object TSRMLS_CC); } Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_api.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -551,8 +551,12 @@ /* {{{ php_mysqli_close */ -void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC) +void php_mysqli_close(MY_MYSQL * mysql, int close_type, int resource_status TSRMLS_DC) { + if (resource_status > MYSQLI_STATUS_INITIALIZED) { + MyG(num_links)--; + } + if (!mysql->persistent) { mysqli_close(mysql->mysql, close_type); } else { @@ -568,7 +572,6 @@ } mysql->persistent = FALSE; } - MyG(num_links)--; mysql->mysql = NULL; php_clear_mysql(mysql); @@ -589,7 +592,8 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); - php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT, ((MYSQLI_RESOURCE *)((mysqli_object *)zend_object_store_get_object(mysql_link TSRMLS_CC))->ptr)->status TSRMLS_CC); + ((MYSQLI_RESOURCE *)((mysqli_object *)zend_object_store_get_object(mysql_link TSRMLS_CC))->ptr)->status = MYSQLI_STATUS_UNKNOWN; MYSQLI_CLEAR_RESOURCE(&mysql_link); efree(mysql); Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -124,7 +124,7 @@ } if (mysql->mysql && mysqli_resource && mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) { /* already connected, we should close the connection */ - php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT, mysqli_resource->status TSRMLS_CC); } if (!socket_len || !socket) { @@ -199,11 +199,11 @@ } } } - if (MyG(max_links) != -1 && MyG(num_links) >= MyG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MyG(num_links)); goto err; } + if (persistent && MyG(max_persistent) != -1 && (MyG(num_active_persistent) + MyG(num_inactive_persistent))>= MyG(max_persistent)) { Modified: php/php-src/branches/PHP_5_3/ext/mysqli/php_mysqli_structs.h =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/php_mysqli_structs.h 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/branches/PHP_5_3/ext/mysqli/php_mysqli_structs.h 2010-05-13 11:05:09 UTC (rev 299335) @@ -215,7 +215,7 @@ extern int php_le_pmysqli(void); extern void php_mysqli_dtor_p_elements(void *data); -extern void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC); +extern void php_mysqli_close(MY_MYSQL * mysql, int close_type, int resource_status TSRMLS_DC); #ifdef HAVE_SPL Modified: php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug51605.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug51605.phpt 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug51605.phpt 2010-05-13 11:05:09 UTC (rev 299335) @@ -1,5 +1,5 @@ --TEST-- -Bug #51647 (Certificate file without private key (pk in another file) doesn't work) +Bug #51605 Mysqli - zombie links --SKIPIF-- <?php require_once('skipif.inc'); @@ -28,9 +28,17 @@ mysqli_close($link); echo "closed twice\n"; + $link = mysqli_init(); + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) { + printf("[003] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + mysqli_close($link); + echo "closed for third time\n"; + print "done!"; ?> --EXPECTF-- closed once closed twice +closed for third time done! Modified: php/php-src/trunk/ext/mysqli/mysqli.c =================================================================== --- php/php-src/trunk/ext/mysqli/mysqli.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/trunk/ext/mysqli/mysqli.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -222,10 +222,11 @@ if (my_res && my_res->ptr) { MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr; if (mysql->mysql) { - php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT, my_res->status TSRMLS_CC); } php_clear_mysql(mysql); efree(mysql); + my_res->status = MYSQLI_STATUS_UNKNOWN; } mysqli_objects_free_storage(object TSRMLS_CC); } Modified: php/php-src/trunk/ext/mysqli/mysqli_api.c =================================================================== --- php/php-src/trunk/ext/mysqli/mysqli_api.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/trunk/ext/mysqli/mysqli_api.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -551,8 +551,12 @@ /* {{{ php_mysqli_close */ -void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC) +void php_mysqli_close(MY_MYSQL * mysql, int close_type, int resource_status TSRMLS_DC) { + if (resource_status > MYSQLI_STATUS_INITIALIZED) { + MyG(num_links)--; + } + if (!mysql->persistent) { mysqli_close(mysql->mysql, close_type); } else { @@ -569,7 +573,6 @@ mysql->persistent = FALSE; } mysql->mysql = NULL; - MyG(num_links)--; php_clear_mysql(mysql); } @@ -589,7 +592,8 @@ MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_INITIALIZED); - php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_EXPLICIT, ((MYSQLI_RESOURCE *)((mysqli_object *)zend_object_store_get_object(mysql_link TSRMLS_CC))->ptr)->status TSRMLS_CC); + ((MYSQLI_RESOURCE *)((mysqli_object *)zend_object_store_get_object(mysql_link TSRMLS_CC))->ptr)->status = MYSQLI_STATUS_UNKNOWN; MYSQLI_CLEAR_RESOURCE(&mysql_link); efree(mysql); Modified: php/php-src/trunk/ext/mysqli/mysqli_nonapi.c =================================================================== --- php/php-src/trunk/ext/mysqli/mysqli_nonapi.c 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/trunk/ext/mysqli/mysqli_nonapi.c 2010-05-13 11:05:09 UTC (rev 299335) @@ -124,7 +124,7 @@ } if (mysql->mysql && mysqli_resource && mysqli_resource->status > MYSQLI_STATUS_INITIALIZED) { /* already connected, we should close the connection */ - php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT TSRMLS_CC); + php_mysqli_close(mysql, MYSQLI_CLOSE_IMPLICIT, mysqli_resource->status TSRMLS_CC); } if (!socket_len || !socket) { @@ -199,11 +199,11 @@ } } } - if (MyG(max_links) != -1 && MyG(num_links) >= MyG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MyG(num_links)); goto err; } + if (persistent && MyG(max_persistent) != -1 && (MyG(num_active_persistent) + MyG(num_inactive_persistent))>= MyG(max_persistent)) { Modified: php/php-src/trunk/ext/mysqli/tests/bug51605.phpt =================================================================== --- php/php-src/trunk/ext/mysqli/tests/bug51605.phpt 2010-05-13 10:39:44 UTC (rev 299334) +++ php/php-src/trunk/ext/mysqli/tests/bug51605.phpt 2010-05-13 11:05:09 UTC (rev 299335) @@ -1,5 +1,5 @@ --TEST-- -Bug #51647 (Certificate file without private key (pk in another file) doesn't work) +Bug #51605 Mysqli - zombie links --SKIPIF-- <?php require_once('skipif.inc'); @@ -28,9 +28,17 @@ mysqli_close($link); echo "closed twice\n"; + $link = mysqli_init(); + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) { + printf("[003] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + mysqli_close($link); + echo "closed for third time\n"; + print "done!"; ?> --EXPECTF-- closed once closed twice +closed for third time done!
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php