[ 
https://issues.apache.org/jira/browse/COMPRESS-595?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

NP updated COMPRESS-595:
------------------------
    Description: 
When `input.read(b)` returns `readNow` < `len`, then it means
 `input.read(b)` will need to be called again with the same
 buffer, whose `remaining()` is now the old `remaining()` - `readNow`.

This way the ReadableByteChannel knows how many bytes are to be
 read in subsequent iterations of the `while (read < len)` loop.

This is currently not the case, because there is a call to rewind()
 which results in a buffer whose remaining() is reset to `len` if
 `readNow` < `len`.

I suspect the readRange() method has only been used with channels that never do 
partial reads (such In Memory Byte Channels backed by an array), and hence the 
problem has not been experienced until now.

 

  was:
When `input.read(b)` returns `readNow` < `len`, then it means
 `input.read(b)` will need to be called again with the same
 buffer, whose `remaining()` is now the old `remaining()` - `readNow`.

This way the ReadableByteChannel knows how many bytes are to be
 read in subsequent iterations of the `while (read < len)` loop.

This is currently not the case, because there is a call to rewind()
 which results in a buffer whose remaining() is reset to `len` if
 `readNow` < `len`.

I suspect the readRange() method has only been used with channels that never do 
partial reads (such as File Channels), and hence the problem has not been 
experienced until now.

 


> IOUtils.readRange(ReadableByteChannel input, int len) reads more than len 
> when input.read() returns < len (ie. there is a partial read)
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: COMPRESS-595
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-595
>             Project: Commons Compress
>          Issue Type: Bug
>    Affects Versions: 1.21
>            Reporter: NP
>            Priority: Major
>         Attachments: IOUtilsTest.kt
>
>
> When `input.read(b)` returns `readNow` < `len`, then it means
>  `input.read(b)` will need to be called again with the same
>  buffer, whose `remaining()` is now the old `remaining()` - `readNow`.
> This way the ReadableByteChannel knows how many bytes are to be
>  read in subsequent iterations of the `while (read < len)` loop.
> This is currently not the case, because there is a call to rewind()
>  which results in a buffer whose remaining() is reset to `len` if
>  `readNow` < `len`.
> I suspect the readRange() method has only been used with channels that never 
> do partial reads (such In Memory Byte Channels backed by an array), and hence 
> the problem has not been experienced until now.
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to