- 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).
This commit is contained in:
Gustavo André dos Santos Lopes 2012-03-17 19:37:30 +00:00
parent a07759a013
commit ef19fba2d5
5 changed files with 64 additions and 1 deletions

2
NEWS
View File

@ -98,6 +98,8 @@ PHP NEWS
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

View File

@ -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

View File

@ -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==

View File

@ -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

View File

@ -344,7 +344,7 @@ PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC) /*
/* 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;
}