summaryrefslogtreecommitdiff
path: root/main/streams/streams.c
diff options
context:
space:
mode:
authorGustavo André dos Santos Lopes <cataphract@php.net>2012-03-17 19:37:30 +0000
committerGustavo André dos Santos Lopes <cataphract@php.net>2012-03-17 19:37:30 +0000
commitd974e4424837042e1ccaebe7be2b47e6006fc456 (patch)
tree1e3202f29f5899c2aa3bb8d259e208de66832ce6 /main/streams/streams.c
parent9bfe8010a031acaf4dc065022eb3cdc71a3a16d8 (diff)
downloadphp-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-xmain/streams/streams.c13
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) {