From: Andrey Hristov Date: Thu, 13 May 2010 11:05:09 +0000 (+0000) Subject: Better fix for #51605 X-Git-Tag: php-5.3.3RC1~170 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87bac04bf17fc395aab07c129a3c16be4f50ba57;p=php Better fix for #51605 --- diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 0f5bc71c63..30bba531e6 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -222,10 +222,11 @@ static void mysqli_link_free_storage(void *object TSRMLS_DC) 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); } diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index e8f4d02467..57cc3187a9 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -551,8 +551,12 @@ PHP_FUNCTION(mysqli_character_set_name) /* {{{ 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 @@ void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC) } mysql->persistent = FALSE; } - MyG(num_links)--; mysql->mysql = NULL; php_clear_mysql(mysql); @@ -589,7 +592,8 @@ PHP_FUNCTION(mysqli_close) 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); diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 34fec47d40..3267529b60 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -124,7 +124,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne } 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 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne } } } - 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)) { diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index ecf91518fb..5712150d58 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -215,7 +215,7 @@ extern zend_class_entry *mysqli_exception_class_entry; 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 diff --git a/ext/mysqli/tests/bug51605.phpt b/ext/mysqli/tests/bug51605.phpt index d8e5c88afc..02328a5be8 100644 --- a/ext/mysqli/tests/bug51605.phpt +++ b/ext/mysqli/tests/bug51605.phpt @@ -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-- --EXPECTF-- closed once closed twice +closed for third time done!