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