Skip to content

Commit

Permalink
- Fixed bug #61371 (resource leak). This bug had two parts, a long st…
Browse files Browse the repository at this point in the history
…anding 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).
  • Loading branch information
cataphract committed Mar 17, 2012
1 parent a07759a commit ef19fba
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 1 deletion.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions ext/standard/tests/streams/bug61115-1.phpt
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions ext/standard/tests/streams/bug61115-2.phpt
Original file line number Diff line number Diff line change
@@ -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==
40 changes: 40 additions & 0 deletions ext/standard/tests/streams/bug61371.phpt
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion main/streams/streams.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit ef19fba

Please sign in to comment.