]> granicus.if.org Git - php/commitdiff
MFH:
authorArnaud Le Blanc <lbarnaud@php.net>
Thu, 8 Jan 2009 18:40:27 +0000 (18:40 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Thu, 8 Jan 2009 18:40:27 +0000 (18:40 +0000)
Fix memleak when a user filter appends a bucket and returns != PSFS_PASS_ON
Improved tests

ext/standard/tests/filters/filter_errors.inc
ext/standard/tests/filters/filter_errors_convert_base64_decode.phpt
ext/standard/tests/filters/filter_errors_user.phpt
ext/standard/user_filters.c

index d39eea36da32b724b4e13a6ce87918aa1d990deb..a03e272b42fc24224cccb764b4edf87a9c3aa05a 100644 (file)
@@ -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);
 
 }
index 39fb28b414d1120557eb8e8def0fd1f168ed5bef..4c043be3b6e792745f0f74e9c0ac85c26ce11ce3 100644 (file)
@@ -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
index edf2e7ca85c63e7dbe055539e6998050e76449a9..7bdf8de08a06444ba454ccd5a226a6e91f94102c 100644 (file)
@@ -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
index d66ed629b438e0292f478ea6587e42f4c0870128..0f98e4f5987f1416d43aff962f03a97eb4826ab3 100644 (file)
@@ -245,6 +245,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