Browse Source

MFH:

Fix memleak when a user filter appends a bucket and returns != PSFS_PASS_ON
Improved tests
PHP-5.2.1RC1
Arnaud Le Blanc 18 years ago
parent
commit
b27f9a96e7
  1. 2
      ext/standard/tests/filters/filter_errors.inc
  2. 2
      ext/standard/tests/filters/filter_errors_convert_base64_decode.phpt
  3. 101
      ext/standard/tests/filters/filter_errors_user.phpt
  4. 8
      ext/standard/user_filters.c

2
ext/standard/tests/filters/filter_errors.inc

@ -27,7 +27,7 @@ function filter_errors_test($filter, $data) {
fwrite($stream, b"$data");
fseek($stream, 0, SEEK_SET);
stream_get_line($stream, 8192, "\r\n");
stream_filter_append($stream, $filter);
stream_get_contents($stream);
}

2
ext/standard/tests/filters/filter_errors_convert_base64_decode.phpt

@ -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
test filtering of non buffered data
Warning: stream_get_contents(): stream filter (convert.base64-decode): invalid byte sequence in %s

101
ext/standard/tests/filters/filter_errors_user.phpt

@ -26,14 +26,18 @@ class test_filter2 extends php_user_filter {
}
class test_filter3 extends php_user_filter {
function filter($in, $out, &$consumed, $closing) {
$bucket = stream_bucket_new($this->stream, "42");
stream_bucket_append($out, $bucket);
if (!$closing) {
$bucket = stream_bucket_new($this->stream, "42");
stream_bucket_append($out, $bucket);
}
return PSFS_ERR_FATAL;
}
}
class test_filter4 extends php_user_filter {
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;
}
}
@ -44,6 +48,43 @@ for($i = 0; $i < 5; ++$i) {
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--
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
test filtering of non buffered data
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
test_filter1
bool(true)
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
test filtering of non buffered data
Warning: stream_get_contents(): Unprocessed filter buckets remaining on input brigade in %s
test_filter4
bool(true)
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
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

8
ext/standard/user_filters.c

@ -248,6 +248,14 @@ php_stream_filter_status_t userfilter_filter(
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,
* keeping a reference to the stream resource here would prevent it

Loading…
Cancel
Save