diff --git a/NEWS b/NEWS index 355a6511203..04bcd32def6 100644 --- a/NEWS +++ b/NEWS @@ -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 diff --git a/ext/standard/tests/streams/bug61115-1.phpt b/ext/standard/tests/streams/bug61115-1.phpt new file mode 100644 index 00000000000..43c54b49742 --- /dev/null +++ b/ext/standard/tests/streams/bug61115-1.phpt @@ -0,0 +1,11 @@ +--TEST-- +Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 1 +--FILE-- + +--EXPECTF-- +Fatal error: Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes) in %s on line %d diff --git a/ext/standard/tests/streams/bug61115-2.phpt b/ext/standard/tests/streams/bug61115-2.phpt new file mode 100644 index 00000000000..260b8369df8 --- /dev/null +++ b/ext/standard/tests/streams/bug61115-2.phpt @@ -0,0 +1,10 @@ +--TEST-- +Bug #61115: Stream related segfault on fatal error in php_stream_context_del_link - variation 2 +--FILE-- + +==DONE== +--EXPECT-- +==DONE== diff --git a/ext/standard/tests/streams/bug61371.phpt b/ext/standard/tests/streams/bug61371.phpt new file mode 100644 index 00000000000..7fbfa56ba28 --- /dev/null +++ b/ext/standard/tests/streams/bug61371.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #61371: stream_context_create() causes memory leaks on use streams_socket_create +--FILE-- + +--EXPECTF-- +memory: %dkb +bool(true) +memory: %dkb +bool(true) +memory: %dkb +memory: %dkb +bool(true) +memory: %dkb +bool(true) +memory: %dkb diff --git a/main/streams/streams.c b/main/streams/streams.c index edcf0fb0250..639ea075a01 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -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; }