From 6cefa510d606d6161bd1df709c2912dff75ecaec Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 13 May 2010 11:05:09 +0000 Subject: [PATCH] Better fix for #51605 --- ext/mysqli/mysqli.c | 3 ++- ext/mysqli/mysqli_api.c | 10 +++++++--- ext/mysqli/mysqli_nonapi.c | 4 ++-- ext/mysqli/tests/bug51605.phpt | 10 +++++++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 3ee998bd7f..61b806a348 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 4be3e3baf7..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 { @@ -569,7 +573,6 @@ void php_mysqli_close(MY_MYSQL * mysql, int close_type TSRMLS_DC) mysql->persistent = FALSE; } mysql->mysql = NULL; - MyG(num_links)--; 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/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! -- 2.40.0