diff options
author | Gustavo André dos Santos Lopes <cataphract@php.net> | 2012-03-17 19:37:30 +0000 |
---|---|---|
committer | Gustavo André dos Santos Lopes <cataphract@php.net> | 2012-03-17 19:37:30 +0000 |
commit | d974e4424837042e1ccaebe7be2b47e6006fc456 (patch) | |
tree | 1e3202f29f5899c2aa3bb8d259e208de66832ce6 /main/streams/streams.c | |
parent | 9bfe8010a031acaf4dc065022eb3cdc71a3a16d8 (diff) | |
download | php-git-d974e4424837042e1ccaebe7be2b47e6006fc456.tar.gz |
- 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).
Diffstat (limited to 'main/streams/streams.c')
-rwxr-xr-x | main/streams/streams.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/main/streams/streams.c b/main/streams/streams.c index 390db1d1ce..161430754e 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -385,7 +385,14 @@ PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC) /* 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 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov } /* 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) { |