com php-src: Fix call after close if multiple filters are attached: ext/standard/tests/streams/stream_multi_filters_close.p hpt main/streams/filter.c

From: Date: Mon, 26 Jan 2015 21:47:35 +0000
Subject: com php-src: Fix call after close if multiple filters are attached: ext/standard/tests/streams/stream_multi_filters_close.p hpt main/streams/filter.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-84380@lists.php.net to get a copy of this message
Commit: b8461eb9ac6683ff398ac556e2ed1bffd8e591a5 Author: Bob Weinand <bobwei9@hotmail.com> Mon, 26 Jan 2015 22:47:35 +0100 Parents: d065a2fc1baa01fa8788c9fb2811ce7707cf5088 Branches: PHP-5.5 Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=b8461eb9ac6683ff398ac556e2ed1bffd8e591a5 Log: Fix call after close if multiple filters are attached Changed paths: A ext/standard/tests/streams/stream_multi_filters_close.phpt M main/streams/filter.c Diff: 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 0000000..f1eb18a --- /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 fa29c0f..f349be4 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;

« previous php.cvs (#84380) next »