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

Reply via email to