]> granicus.if.org Git - php/commitdiff
Fix call after close if multiple filters are attached
authorBob Weinand <bobwei9@hotmail.com>
Mon, 26 Jan 2015 21:47:35 +0000 (22:47 +0100)
committerBob Weinand <bobwei9@hotmail.com>
Mon, 26 Jan 2015 21:47:35 +0000 (22:47 +0100)
ext/standard/tests/streams/stream_multi_filters_close.phpt [new file with mode: 0644]
main/streams/filter.c

diff --git a/ext/standard/tests/streams/stream_multi_filters_close.phpt b/ext/standard/tests/streams/stream_multi_filters_close.phpt
new file mode 100644 (file)
index 0000000..f1eb18a
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+Check if multiple filters are closed correctly and never called again after close
+--FILE--
+<?php
+
+class FirstFilter extends php_user_filter {
+       public function filter($in, $out, &$consumed, $closing) {
+               static $closed = 0;
+
+               while ($bucket = stream_bucket_make_writeable($in)) {
+                       stream_bucket_append($out, stream_bucket_new($this->stream, $bucket->data));
+               }
+
+               if ($closing) {
+                       $closed++;
+               }
+
+               if ($closed > 0) {
+                       var_dump($closed++);
+               }
+               return PSFS_PASS_ON;
+       }
+}
+
+class SecondFilter extends php_user_filter {
+       public function filter($in, $out, &$consumed, $closing) {
+               static $closed = 0;
+
+               while ($bucket = stream_bucket_make_writeable($in)) {
+                       stream_bucket_append($out, stream_bucket_new($this->stream, $bucket->data));
+               }
+
+               if ($closing) {
+                       $closed++;
+               }
+
+               if ($closed > 0) {
+                       var_dump($closed++);
+               }
+               return PSFS_PASS_ON;
+       }
+}
+
+$r = fopen("php://stdout", "w+");
+stream_filter_register("first", "FirstFilter");
+stream_filter_register("second", "SecondFilter");
+$first = stream_filter_prepend($r, "first", STREAM_FILTER_WRITE, []);
+$second = stream_filter_prepend($r, "second", STREAM_FILTER_WRITE, []);
+fwrite($r, "test\n");
+stream_filter_remove($second);
+stream_filter_remove($first);
+?>
+--EXPECT--
+test
+int(1)
+int(1)
index fa29c0f6e29e732a2b818d8119233539beba4b5d..f349be4914834783dc72192345b9d82af3061627 100644 (file)
@@ -449,7 +449,7 @@ PHPAPI int _php_stream_filter_flush(php_stream_filter *filter, int finish TSRMLS
        for(current = filter; current; current = current->next) {
                php_stream_filter_status_t status;
 
-               status = filter->fops->filter(stream, filter, inp, outp, NULL, flags TSRMLS_CC);
+               status = filter->fops->filter(stream, current, inp, outp, NULL, flags TSRMLS_CC);
                if (status == PSFS_FEED_ME) {
                        /* We've flushed the data far enough */
                        return SUCCESS;