mirror of
https://github.com/php/php-src.git
synced 2025-08-19 08:49:28 +02:00
Fix memleak when a user filter appends a bucket and returns != PSFS_PASS_ON
Improved tests
This commit is contained in:
parent
073f4b92d2
commit
6bc39dc96c
4 changed files with 109 additions and 4 deletions
|
@ -27,7 +27,7 @@ function filter_errors_test($filter, $data) {
|
||||||
fwrite($stream, b"$data");
|
fwrite($stream, b"$data");
|
||||||
fseek($stream, 0, SEEK_SET);
|
fseek($stream, 0, SEEK_SET);
|
||||||
|
|
||||||
stream_get_line($stream, 8192, "\r\n");
|
stream_filter_append($stream, $filter);
|
||||||
stream_get_contents($stream);
|
stream_get_contents($stream);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,3 +14,5 @@ Warning: stream_filter_append(): stream filter (convert.base64-decode): invalid
|
||||||
|
|
||||||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
||||||
test filtering of non buffered data
|
test filtering of non buffered data
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in %s
|
||||||
|
|
|
@ -26,14 +26,18 @@ class test_filter2 extends php_user_filter {
|
||||||
}
|
}
|
||||||
class test_filter3 extends php_user_filter {
|
class test_filter3 extends php_user_filter {
|
||||||
function filter($in, $out, &$consumed, $closing) {
|
function filter($in, $out, &$consumed, $closing) {
|
||||||
$bucket = stream_bucket_new($this->stream, "42");
|
if (!$closing) {
|
||||||
stream_bucket_append($out, $bucket);
|
$bucket = stream_bucket_new($this->stream, "42");
|
||||||
|
stream_bucket_append($out, $bucket);
|
||||||
|
}
|
||||||
return PSFS_ERR_FATAL;
|
return PSFS_ERR_FATAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class test_filter4 extends php_user_filter {
|
class test_filter4 extends php_user_filter {
|
||||||
function filter($in, $out, &$consumed, $closing) {
|
function filter($in, $out, &$consumed, $closing) {
|
||||||
$bucket = stream_bucket_new($this->stream, "42");
|
if (!$closing) {
|
||||||
|
$bucket = stream_bucket_new($this->stream, "42");
|
||||||
|
}
|
||||||
return PSFS_ERR_FATAL;
|
return PSFS_ERR_FATAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,6 +48,43 @@ for($i = 0; $i < 5; ++$i) {
|
||||||
filter_errors_test("test_filter$i", "42");
|
filter_errors_test("test_filter$i", "42");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "test append / read / remove\n";
|
||||||
|
for($i = 0; $i < 5; ++$i) {
|
||||||
|
echo "test_filter$i\n";
|
||||||
|
$stream = fopen('php://memory', 'wb+');
|
||||||
|
fwrite($stream, b"42");
|
||||||
|
fseek($stream, 0, SEEK_SET);
|
||||||
|
$f = stream_filter_append($stream, "test_filter$i");
|
||||||
|
stream_get_contents($stream);
|
||||||
|
stream_filter_remove($f);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "test append all / read / remove all\n";
|
||||||
|
$stream = fopen('php://memory', 'wb+');
|
||||||
|
fwrite($stream, b"42");
|
||||||
|
fseek($stream, 0, SEEK_SET);
|
||||||
|
$filters = array();
|
||||||
|
for($i = 0; $i < 5; ++$i) {
|
||||||
|
echo "test_filter$i\n";
|
||||||
|
$filters[] = stream_filter_append($stream, "test_filter$i");
|
||||||
|
}
|
||||||
|
stream_get_contents($stream);
|
||||||
|
foreach($filters as $filter) {
|
||||||
|
stream_filter_remove($filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "test append all / read / close\n";
|
||||||
|
$stream = fopen('php://memory', 'wb+');
|
||||||
|
fwrite($stream, b"42");
|
||||||
|
fseek($stream, 0, SEEK_SET);
|
||||||
|
$filters = array();
|
||||||
|
for($i = 0; $i < 5; ++$i) {
|
||||||
|
echo "test_filter$i\n";
|
||||||
|
$filters[] = stream_filter_append($stream, "test_filter$i");
|
||||||
|
}
|
||||||
|
stream_get_contents($stream);
|
||||||
|
fclose($stream);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
--EXPECTF--
|
--EXPECTF--
|
||||||
test_filter0
|
test_filter0
|
||||||
|
@ -54,6 +95,8 @@ Warning: stream_filter_append(): Unprocessed filter buckets remaining on input b
|
||||||
|
|
||||||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
||||||
test filtering of non buffered data
|
test filtering of non buffered data
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
test_filter1
|
test_filter1
|
||||||
bool(true)
|
bool(true)
|
||||||
test filtering of buffered data
|
test filtering of buffered data
|
||||||
|
@ -74,6 +117,8 @@ Warning: stream_filter_append(): Unprocessed filter buckets remaining on input b
|
||||||
|
|
||||||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
||||||
test filtering of non buffered data
|
test filtering of non buffered data
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
test_filter4
|
test_filter4
|
||||||
bool(true)
|
bool(true)
|
||||||
test filtering of buffered data
|
test filtering of buffered data
|
||||||
|
@ -82,3 +127,53 @@ Warning: stream_filter_append(): Unprocessed filter buckets remaining on input b
|
||||||
|
|
||||||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s
|
||||||
test filtering of non buffered data
|
test filtering of non buffered data
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
test append / read / remove
|
||||||
|
test_filter0
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test_filter1
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test_filter2
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test_filter3
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test_filter4
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test append all / read / remove all
|
||||||
|
test_filter0
|
||||||
|
test_filter1
|
||||||
|
test_filter2
|
||||||
|
test_filter3
|
||||||
|
test_filter4
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
|
||||||
|
Warning: stream_filter_remove(): Unable to flush filter, not removing in %s
|
||||||
|
test append all / read / close
|
||||||
|
test_filter0
|
||||||
|
test_filter1
|
||||||
|
test_filter2
|
||||||
|
test_filter3
|
||||||
|
test_filter4
|
||||||
|
|
||||||
|
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
|
||||||
|
|
|
@ -245,6 +245,14 @@ php_stream_filter_status_t userfilter_filter( php_stream *stream, php_stream_fil
|
||||||
php_stream_bucket_delref(bucket TSRMLS_CC);
|
php_stream_bucket_delref(bucket TSRMLS_CC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (ret != PSFS_PASS_ON) {
|
||||||
|
php_stream_bucket *bucket = buckets_out->head;
|
||||||
|
while (bucket != NULL) {
|
||||||
|
php_stream_bucket_unlink(bucket TSRMLS_CC);
|
||||||
|
php_stream_bucket_delref(bucket TSRMLS_CC);
|
||||||
|
bucket = buckets_out->head;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* filter resources are cleaned up by the stream destructor,
|
/* filter resources are cleaned up by the stream destructor,
|
||||||
* keeping a reference to the stream resource here would prevent it
|
* keeping a reference to the stream resource here would prevent it
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue