Usually it will already fail when opening, but reads can also
fail since PHP 7.4, in which case we still need to place the
file handle in open_files to make sure the destructor will run
on it.
--- /dev/null
+--TEST--
+Include fails during read
+--FILE--
+<?php
+class SampleFilter extends php_user_filter { }
+stream_filter_register('sample.filter', SampleFilter::class);
+include 'php://filter/read=sample.filter/resource='. __FILE__;
+?>
+--EXPECTF--
+Warning: include(): Unprocessed filter buckets remaining on input brigade in %s on line %d
+
+Warning: include(): Failed opening 'php://filter/read=sample.filter/resource=%s' for inclusion (include_path='%s') in %s on line %d
zend_string *compiled_filename;
if (zend_stream_fixup(file_handle, &buf, &size) == FAILURE) {
+ /* Still add it to open_files to make destroy_file_handle work */
+ zend_llist_add_element(&CG(open_files), file_handle);
return FAILURE;
}