ID:               46026
 Updated by:       [EMAIL PROTECTED]
-Summary:          bz2_decompress_filter tries to decompress after end of
                   stream
 Reported By:      Keisial at gmail dot com
 Status:           Verified
 Bug Type:         Bzip2 Related
 Operating System: *
 PHP Version:      5.2CVS-2008-09-08 (snap)
 Assigned To:      cellog
 New Comment:

changing summary to reflect addition of zlib problem


Previous Comments:
------------------------------------------------------------------------

[2008-10-11 18:25:14] [EMAIL PROTECTED]

In the future, please follow 2 important elements of the coding
standards:

1) use tabs instead of spaces
2) always use {} around if/else blocks

I had to waste 15 minutes just getting the patch formatted correctly
before I could even begin testing it.  I don't like wasting time.

------------------------------------------------------------------------

[2008-10-11 17:12:10] [EMAIL PROTECTED]

this same bug applies to zlib stream filter, and also happens simply
when trying to read from a filtered stream that contains a limited
amount of compressed data (as in a zip archive with a bz2-compressed
file), as php_stream_fill_read_buffer reads in maxlen data, triggering
the problem you found.  I'll try to get this fixed up and put in a few
tests

------------------------------------------------------------------------

[2008-09-19 16:47:15] Keisial at gmail dot com

Ok, I have implemented a fix.

Patch: http://pastebin.com/f24d58100
Patch ignoring whitespaces: http://pastebin.com/fb084a7b

When adding a filter to a stream, "bzip2.decompress", $parameters only
indicated if bzlib should use the alternative decompression algorithm
which uses less memory but at the cost of decompressing more slowly,
either as a boolean or as an array("small"=>value). I have extended the
array syntax to also allow a 'concatenated' parameter.

By default, bzip2.decompress filter won't process any data after it has
reached and end-of-stream. However, if you provide
array("concatenated"=>true) it will continue reading as if it has
another bzip2 stream concatenated, just as bzip2 does.

In the future, it would be nice to be able to apply a bzip2.decompress,
read the data, remove the filter, and read non-bzip data appended, but
the stream_filter system would need to be extended to support that.

Additionally, if there is a decompression error, it will show a
warning. Also, bzip2 internal buffers will now be allocated later and
freed sooner.

------------------------------------------------------------------------

[2008-09-08 22:58:41] Keisial at gmail dot com

Description:
------------
If the input is larger than the bzip2 stream, bz2_decompress_filter
tries to continue decompressing after it has received a BZ_STREAM_END,
so bzlib returns BZ_SEQUENCE_ERROR and the stream filter finalises with
PSFS_ERR_FATAL, getting no output.

Reproduce code:
---------------
bz2Decompress.php:
<?php
 $f = fopen($argv[1], "rb");
 stream_filter_append($f, "bzip2.decompress");
 fpassthru($f);
 fclose($f);
?>

$ echo 'Hello world' > hello.txt
$ bzip2 hello.txt
$ php bz2Decompress.php hello.txt.bz2
Hello world
$ echo '!' >> hello.txt.bz2
$ php bz2Decompress.php hello.txt.bz2
/* No output */

Expected result:
----------------
At least the correctly read data should be returned.

Two things can be done on receiving a BZ_STREAM_END:
-Setting an EOF flag and remove any further incoming data (allow to
continue reading if the filter is removed?).
-Reinitialising the decompressing library (approach of the bzip2
utility) so concatenated bzip2 streams can be unbzipped as the
concatenation of its output.



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=46026&edit=1

Reply via email to