cataphract                               Sat, 17 Mar 2012 19:37:30 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=324324

Log:
- Fixed bug #61371 (resource leak). This bug had two parts, a long standing leak
  already fixed in trunk/5.3 and now merged onto 5.4 and a leak introduced in
  fixing bug #61115. This better fix for #61115 fixes the leak (the inhibition
  for deleting the context was too broad) and so prevents segfaults in new
  circumstances (where the inhibition was not broad enough).

Bugs: https://bugs.php.net/61371 (Verified) stream_context_create() causes 
memory leaks on use streams_socket_create
      https://bugs.php.net/61115 (Assigned) Stream related segfault on fatal 
error in php_stream_context_del_link
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    A + php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-1.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A + php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-2.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A   php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61371.phpt
    U   php/php-src/branches/PHP_5_3/main/streams/streams.c
    U   php/php-src/branches/PHP_5_4/ext/standard/streamsfuncs.c
    A + php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-1.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A + php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-2.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A + php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A   php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61371.phpt
    U   php/php-src/branches/PHP_5_4/main/streams/streams.c
    A + php/php-src/trunk/ext/standard/tests/streams/bug61115-1.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A + php/php-src/trunk/ext/standard/tests/streams/bug61115-2.phpt
        (from 
php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt:r324314)
    A   php/php-src/trunk/ext/standard/tests/streams/bug61371.phpt
    U   php/php-src/trunk/main/streams/streams.c

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS	2012-03-17 17:51:51 UTC (rev 324323)
+++ php/php-src/branches/PHP_5_3/NEWS	2012-03-17 19:37:30 UTC (rev 324324)
@@ -98,6 +98,8 @@
     SessionHandler::write()). (Ilia)

 - Streams:
+  . Fixed bug #61371 (stream_context_create() causes memory leaks on use
+    streams_socket_create). (Gustavo)
   . Fixed bug #61253 (Wrappers opened with errors concurrency problem on ZTS).
     (Gustavo)
   . Fixed bug #61115 (stream related segfault on fatal error in

Copied: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-1.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-1.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-1.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,11 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 1
+--FILE--
+<?php
+
+$fileResourceTemp = fopen('php://temp', 'wr');
+stream_context_get_options($fileResourceTemp);
+ftruncate($fileResourceTemp, PHP_INT_MAX);
+?>
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes) in %s on line %d

Copied: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-2.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-2.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61115-2.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,10 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 2
+--FILE--
+<?php
+stream_socket_client('abc', $var, $var, 0, STREAM_CLIENT_PERSISTENT);
+
+?>
+==DONE==
+--EXPECT--
+==DONE==

Added: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61371.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61371.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61371.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,40 @@
+--TEST--
+Bug #61371: stream_context_create() causes memory leaks on use streams_socket_create
+--FILE--
+<?php
+function test($doFclose) {
+$previous = null;
+$current = null;
+for($test=1;$test<=3;$test++) {
+	$current = memory_get_usage(true);
+	if (!is_null($previous)) {
+		var_dump($previous == $current);
+	}
+	$previous = $current;
+	echo 'memory: '.round($current / 1024, 0)."kb\n";
+	for($i=0;$i<=100;$i++) {
+		$context = stream_context_create(array());
+		$stream = stream_socket_client('udp://0.0.0.0:80', $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
+		if ($doFclose) fclose($stream);
+		unset($context);
+		unset($stream);
+		unset($errno);
+		unset($errstr);
+	}
+}
+}
+
+test(true);
+test(false);
+?>
+--EXPECTF--
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb


Property changes on: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug61371.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_3/main/streams/streams.c
===================================================================
--- php/php-src/branches/PHP_5_3/main/streams/streams.c	2012-03-17 17:51:51 UTC (rev 324323)
+++ php/php-src/branches/PHP_5_3/main/streams/streams.c	2012-03-17 19:37:30 UTC (rev 324324)
@@ -344,7 +344,7 @@
 	/* on an resource list destruction, the context, another resource, may have
 	 * already been freed (if it was created after the stream resource), so
 	 * don't reference it */
-	if (!(close_options & PHP_STREAM_FREE_RSRC_DTOR)) {
+	if (EG(active)) {
 		context = stream->context;
 	}


Modified: php/php-src/branches/PHP_5_4/ext/standard/streamsfuncs.c
===================================================================
--- php/php-src/branches/PHP_5_4/ext/standard/streamsfuncs.c	2012-03-17 17:51:51 UTC (rev 324323)
+++ php/php-src/branches/PHP_5_4/ext/standard/streamsfuncs.c	2012-03-17 19:37:30 UTC (rev 324324)
@@ -106,10 +106,6 @@

 	context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);

-	if (context) {
-		zend_list_addref(context->rsrc_id);
-	}
-
 	if (flags & PHP_STREAM_CLIENT_PERSISTENT) {
 		spprintf(&hashkey, 0, "stream_socket_client__%s", host);
 	}

Copied: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-1.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-1.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-1.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,11 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 1
+--FILE--
+<?php
+
+$fileResourceTemp = fopen('php://temp', 'wr');
+stream_context_get_options($fileResourceTemp);
+ftruncate($fileResourceTemp, PHP_INT_MAX);
+?>
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes) in %s on line %d

Copied: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-2.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-2.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115-2.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,10 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 2
+--FILE--
+<?php
+stream_socket_client('abc', $var, $var, 0, STREAM_CLIENT_PERSISTENT);
+
+?>
+==DONE==
+--EXPECT--
+==DONE==

Copied: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61115.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,13 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link.
+--FILE--
+<?php
+
+$arrayLarge = array_fill(0, 113663, '*');
+
+$resourceFileTemp = fopen('php://temp', 'r+');
+stream_context_set_params($resourceFileTemp, array());
+preg_replace('', function() {}, $resourceFileTemp);
+?>
+--EXPECTF--
+Catchable fatal error: Object of class Closure could not be converted to string in %s on line %d

Added: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61371.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61371.phpt	                        (rev 0)
+++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61371.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,40 @@
+--TEST--
+Bug #61371: stream_context_create() causes memory leaks on use streams_socket_create
+--FILE--
+<?php
+function test($doFclose) {
+$previous = null;
+$current = null;
+for($test=1;$test<=3;$test++) {
+	$current = memory_get_usage(true);
+	if (!is_null($previous)) {
+		var_dump($previous == $current);
+	}
+	$previous = $current;
+	echo 'memory: '.round($current / 1024, 0)."kb\n";
+	for($i=0;$i<=100;$i++) {
+		$context = stream_context_create(array());
+		$stream = stream_socket_client('udp://0.0.0.0:80', $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
+		if ($doFclose) fclose($stream);
+		unset($context);
+		unset($stream);
+		unset($errno);
+		unset($errstr);
+	}
+}
+}
+
+test(true);
+test(false);
+?>
+--EXPECTF--
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb


Property changes on: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug61371.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/branches/PHP_5_4/main/streams/streams.c
===================================================================
--- php/php-src/branches/PHP_5_4/main/streams/streams.c	2012-03-17 17:51:51 UTC (rev 324323)
+++ php/php-src/branches/PHP_5_4/main/streams/streams.c	2012-03-17 19:37:30 UTC (rev 324324)
@@ -385,8 +385,15 @@
 	int ret = 1;
 	int preserve_handle = close_options & PHP_STREAM_FREE_PRESERVE_HANDLE ? 1 : 0;
 	int release_cast = 1;
-	php_stream_context *context = stream->context;
+	php_stream_context *context = NULL;

+	/* on an resource list destruction, the context, another resource, may have
+	 * already been freed (if it was created after the stream resource), so
+	 * don't reference it */
+	if (EG(active)) {
+		context = stream->context;
+	}
+
 	if (stream->flags & PHP_STREAM_FLAG_NO_CLOSE) {
 		preserve_handle = 1;
 	}
@@ -464,8 +471,8 @@
 	}

 	/* Remove stream from any context link list */
-	if (stream->context && stream->context->links) {
-		php_stream_context_del_link(stream->context, stream);
+	if (context && context->links) {
+		php_stream_context_del_link(context, stream);
 	}

 	if (close_options & PHP_STREAM_FREE_CALL_DTOR) {

Copied: php/php-src/trunk/ext/standard/tests/streams/bug61115-1.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/trunk/ext/standard/tests/streams/bug61115-1.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/standard/tests/streams/bug61115-1.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,11 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 1
+--FILE--
+<?php
+
+$fileResourceTemp = fopen('php://temp', 'wr');
+stream_context_get_options($fileResourceTemp);
+ftruncate($fileResourceTemp, PHP_INT_MAX);
+?>
+--EXPECTF--
+Fatal error: Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes) in %s on line %d

Copied: php/php-src/trunk/ext/standard/tests/streams/bug61115-2.phpt (from rev 324314, php/php-src/trunk/ext/standard/tests/streams/bug61115.phpt)
===================================================================
--- php/php-src/trunk/ext/standard/tests/streams/bug61115-2.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/standard/tests/streams/bug61115-2.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,10 @@
+--TEST--
+Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 2
+--FILE--
+<?php
+stream_socket_client('abc', $var, $var, 0, STREAM_CLIENT_PERSISTENT);
+
+?>
+==DONE==
+--EXPECT--
+==DONE==

Added: php/php-src/trunk/ext/standard/tests/streams/bug61371.phpt
===================================================================
--- php/php-src/trunk/ext/standard/tests/streams/bug61371.phpt	                        (rev 0)
+++ php/php-src/trunk/ext/standard/tests/streams/bug61371.phpt	2012-03-17 19:37:30 UTC (rev 324324)
@@ -0,0 +1,40 @@
+--TEST--
+Bug #61371: stream_context_create() causes memory leaks on use streams_socket_create
+--FILE--
+<?php
+function test($doFclose) {
+$previous = null;
+$current = null;
+for($test=1;$test<=3;$test++) {
+	$current = memory_get_usage(true);
+	if (!is_null($previous)) {
+		var_dump($previous == $current);
+	}
+	$previous = $current;
+	echo 'memory: '.round($current / 1024, 0)."kb\n";
+	for($i=0;$i<=100;$i++) {
+		$context = stream_context_create(array());
+		$stream = stream_socket_client('udp://0.0.0.0:80', $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $context);
+		if ($doFclose) fclose($stream);
+		unset($context);
+		unset($stream);
+		unset($errno);
+		unset($errstr);
+	}
+}
+}
+
+test(true);
+test(false);
+?>
+--EXPECTF--
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb
+memory: %dkb
+bool(true)
+memory: %dkb
+bool(true)
+memory: %dkb


Property changes on: php/php-src/trunk/ext/standard/tests/streams/bug61371.phpt
___________________________________________________________________
Added: svn:keywords
   + Id Rev Revision
Added: svn:eol-style
   + native

Modified: php/php-src/trunk/main/streams/streams.c
===================================================================
--- php/php-src/trunk/main/streams/streams.c	2012-03-17 17:51:51 UTC (rev 324323)
+++ php/php-src/trunk/main/streams/streams.c	2012-03-17 19:37:30 UTC (rev 324324)
@@ -390,7 +390,7 @@
 	/* on an resource list destruction, the context, another resource, may have
 	 * already been freed (if it was created after the stream resource), so
 	 * don't reference it */
-	if (!(close_options & PHP_STREAM_FREE_RSRC_DTOR)) {
+	if (EG(active)) {
 		context = stream->context;
 	}

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to