summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_language_scanner.l4
-rw-r--r--main/main.c7
2 files changed, 9 insertions, 2 deletions
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 7cd266f..350cdfa 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -244,7 +244,9 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh)
fclose(fh->handle.fp);
break;
case ZEND_HANDLE_STREAM:
- fh->handle.stream.closer(fh->handle.stream.handle TSRMLS_CC);
+ if (fh->handle.stream.closer) {
+ fh->handle.stream.closer(fh->handle.stream.handle TSRMLS_CC);
+ }
break;
case ZEND_HANDLE_FILENAME:
/* We're only supposed to get here when destructing the used_files hash,
diff --git a/main/main.c b/main/main.c
index f64a35c..b61b6a8 100644
--- a/main/main.c
+++ b/main/main.c
@@ -857,9 +857,14 @@ static int php_stream_open_for_zend(const char *filename, zend_file_handle *hand
handle->free_filename = 0;
handle->handle.stream.handle = stream;
handle->handle.stream.reader = (zend_stream_reader_t)_php_stream_read;
- handle->handle.stream.closer = stream_closer_for_zend;
+ /* don't set this; all streams are tracked as part of the resource system,
+ * and we'll end up double-free'ing them if we allow zend to close them
+ * down after the resource list has been cleaned up */
+ handle->handle.stream.closer = NULL; /* stream_closer_for_zend; */
handle->handle.stream.fteller = stream_fteller_for_zend;
handle->handle.stream.interactive = 0;
+ /* suppress warning if this stream is not explicitly closed */
+ php_stream_auto_cleanup(stream);
return SUCCESS;
}