diff options
| author | Bob Weinand <bobwei9@hotmail.com> | 2015-01-26 22:47:35 +0100 |
|---|---|---|
| committer | Bob Weinand <bobwei9@hotmail.com> | 2015-01-26 22:47:35 +0100 |
| commit | b8461eb9ac6683ff398ac556e2ed1bffd8e591a5 (patch) | |
| tree | f407df25b9ed31005a4ecf56913e6be442abff23 | |
| parent | d065a2fc1baa01fa8788c9fb2811ce7707cf5088 (diff) | |
| download | php-git-b8461eb9ac6683ff398ac556e2ed1bffd8e591a5.tar.gz | |
Fix call after close if multiple filters are attached
| -rw-r--r-- | ext/standard/tests/streams/stream_multi_filters_close.phpt | 56 | ||||
| -rw-r--r-- | main/streams/filter.c | 2 |
2 files changed, 57 insertions, 1 deletions
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 index 0000000000..f1eb18a15c --- /dev/null +++ b/ext/standard/tests/streams/stream_multi_filters_close.phpt @@ -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) diff --git a/main/streams/filter.c b/main/streams/filter.c index fa29c0f6e2..f349be4914 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -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; |
