]> granicus.if.org Git - php/commitdiff
Better fix for #51605
authorAndrey Hristov <andrey@php.net>
Thu, 13 May 2010 11:05:09 +0000 (11:05 +0000)
committerAndrey Hristov <andrey@php.net>
Thu, 13 May 2010 11:05:09 +0000 (11:05 +0000)
ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_nonapi.c
ext/mysqli/php_mysqli_structs.h
ext/mysqli/tests/bug51605.phpt

index 0f5bc71c63282b8e6cd68e918fa2fb0d917caae8..30bba531e605f0dac0eb2a8706f6cb51bec771a0 100644 (file)
@@ -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);
 }
index e8f4d02467edcb086f0f5a0fba21a3c2484f9727..57cc3187a9eb76f23e7c75b0c6bde7a2be353c6e 100644 (file)
@@ -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);
index 34fec47d409c2bae62c0eb21351b930f57ccfe86..3267529b60a557fdcfe44b4a8a8379c4e60c0e32 100644 (file)
@@ -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))
        {
index ecf91518fb86b86cb9d154fe3f6e85d00e044ad7..5712150d58b606b305cc25e40fec7a6a8b522591 100644 (file)
@@ -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
index d8e5c88afcd7b5a1a69c057c6770334c43e79ead..02328a5be882c14d85cbdef63567759714eaa425 100644 (file)
@@ -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.reconnect = Off
        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!