]> granicus.if.org Git - php/commitdiff
Fixed bug #78406
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 08:22:32 +0000 (10:22 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 13 Aug 2019 08:22:32 +0000 (10:22 +0200)
NEWS
Zend/tests/bug78406.phpt [new file with mode: 0644]
main/main.c

diff --git a/NEWS b/NEWS
index efa95a30f9f84320342dc91c57e5f669c8c7dec3..1254024d36dd8f96b5c0385661b02d1ec0be89e0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,8 @@ PHP                                                                        NEWS
 - Core:
   . Fixed bug #78396 (Second file_put_contents in Shutdown hangs script).
     (Nikita)
+  . Fixed bug #78406 (Broken file includes with user-defined stream filters).
+    (Nikita)
 
 - Date:
   . Fixed bug #78383 (Casting a DateTime to array no longer returns its
diff --git a/Zend/tests/bug78406.phpt b/Zend/tests/bug78406.phpt
new file mode 100644 (file)
index 0000000..64fd2a1
--- /dev/null
@@ -0,0 +1,44 @@
+--TEST--
+Bug #78406: Broken file includes with user-defined stream filters
+--FILE--
+<?php
+
+echo "bug\n"; // Should be transformed by filter on second include
+
+if (!class_exists(SampleFilter::class)) {
+    class SampleFilter extends php_user_filter
+    {
+        private $data = '';
+
+        public function filter($in, $out, &$consumed, $closing)
+        {
+            while ($bucket = stream_bucket_make_writeable($in))
+            {
+                $this->data .= $bucket->data;
+            }
+
+            if ($closing || feof($this->stream))
+            {
+                $consumed = strlen($this->data);
+
+                $this->data = str_replace('bug', 'feature', $this->data);
+
+                $bucket = stream_bucket_new($this->stream, $this->data);
+                stream_bucket_append($out, $bucket);
+
+                return PSFS_PASS_ON;
+            }
+
+            return PSFS_FEED_ME;
+        }
+    }
+    stream_filter_register('sample.filter', SampleFilter::class);
+    $uri = 'php://filter/read=sample.filter/resource='. __FILE__;
+
+    include $uri; // We expect one more "feature" output at line 3
+}
+
+?>
+--EXPECT--
+bug
+feature
index 5822cbfa217b8a1e0e930fc7d2b3ac1fe083d68e..d86502788710f7aa79d2660e200115a71adba6f9 100644 (file)
@@ -1564,8 +1564,16 @@ static void php_zend_stream_closer(void *handle) /* {{{ */
 
 static size_t php_zend_stream_fsizer(void *handle) /* {{{ */
 {
-       php_stream_statbuf  ssb;
-       if (php_stream_stat((php_stream*)handle, &ssb) == 0) {
+       php_stream *stream = handle;
+       php_stream_statbuf ssb;
+
+       /* File size reported by stat() may be inaccurate if stream filters are used.
+        * TODO: Should stat() be generally disabled if filters are used? */
+       if (stream->readfilters.head) {
+               return 0;
+       }
+
+       if (php_stream_stat(stream, &ssb) == 0) {
                return ssb.sb.st_size;
        }
        return 0;