Nathan Kronenfeld created COMPRESS-309:
------------------------------------------

             Summary: BZip2CompressorInputStream return value wrong when told 
to read to a full buffer.
                 Key: COMPRESS-309
                 URL: https://issues.apache.org/jira/browse/COMPRESS-309
             Project: Commons Compress
          Issue Type: Bug
          Components: Compressors
    Affects Versions: 1.9, 1.4.1
            Reporter: Nathan Kronenfeld


BZip2CompressorInputStream.read(buffer, offset, length) returns -1 when given 
an offset equal to the length of the buffer.

This indicates, not that the buffer was full, but that the stream was finished.

It seems like a pretty stupid thing to do - but I'm getting this when trying to 
use Kryo serialization (which is probably a bug on their part, too), so it does 
occur and has negative affects.

Here's a JUnit test that shows the problem specifically:

{noformat}
        @Test
        public void testApacheCommonsBZipUncompression () throws Exception {
                // Create a big random piece of data
                byte[] rawData = new byte[1048576];
                for (int i=0; i<rawData.length; ++i) {
                        rawData[i] = (byte) Math.floor(Math.random()*256);
                }

                // Compress it
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                BZip2CompressorOutputStream bzipOut = new 
BZip2CompressorOutputStream(baos);
                bzipOut.write(rawData);
                bzipOut.flush();
                bzipOut.close();
                baos.flush();
                baos.close();

                // Try to read it back in
                ByteArrayInputStream bais = new 
ByteArrayInputStream(baos.toByteArray());
                BZip2CompressorInputStream bzipIn = new 
BZip2CompressorInputStream(bais);
                byte[] buffer = new byte[1024];
                // Works fine
                Assert.assertEquals(1024, bzipIn.read(buffer, 0, 1024));
                // Fails, returns -1 (indicating the stream is complete rather 
than that the buffer 
                // was full)
                Assert.assertEquals(0, bzipIn.read(buffer, 1024, 0));
                // But if you change the above expected value to -1, the 
following line still works
                Assert.assertEquals(1024, bzipIn.read(buffer, 0, 1024));
                bzipIn.close();
        }
{noformat}




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to