Close the stream filter resources when removing them from the stream.
?? ??? 2020, PHP 7.2.30
- Standard:
+ . Fixed bug #79468 (SIGSEGV when closing stream handle with a stream filter
+ appended). (dinosaur)
. Fixed bug #79330 (shell_exec() silently truncates after a null byte). (stas)
. Fixed bug #79465 (OOB Read in urldecode()). (stas)
--- /dev/null
+--TEST--
+Bug #79468 SIGSEGV when closing stream handle with a stream filter appended
+--SKIPIF--
+<?php
+$filters = stream_get_filters();
+if(! in_array( "string.rot13", $filters )) die( "skip rot13 filter not available." );
+?>
+--FILE--
+<?php
+$fp = fopen('php://temp', 'rb');
+$rot13_filter = stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);
+fwrite($fp, "This is ");
+fclose($fp);
+try {
+ stream_filter_remove($rot13_filter);
+} catch (\Throwable $e) {
+ var_dump($e->getMessage());
+}
+?>
+--EXPECTF--
+Warning: stream_filter_remove(): Invalid resource given, not a stream filter in %s on line %d
if (close_options & PHP_STREAM_FREE_RELEASE_STREAM) {
while (stream->readfilters.head) {
+ if (stream->readfilters.head->res != NULL) {
+ zend_list_close(stream->readfilters.head->res);
+ }
php_stream_filter_remove(stream->readfilters.head, 1);
}
while (stream->writefilters.head) {
+ if (stream->writefilters.head->res != NULL) {
+ zend_list_close(stream->writefilters.head->res);
+ }
php_stream_filter_remove(stream->writefilters.head, 1);
}