[ 
https://issues.apache.org/jira/browse/IO-871?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17938343#comment-17938343
 ] 

Éamonn McManus commented on IO-871:
-----------------------------------

OK, I can confirm that all of our tests work with the latest snapshot.

> IOUtils.contentEquals is incorrect when InputStream.available under-reports
> ---------------------------------------------------------------------------
>
>                 Key: IO-871
>                 URL: https://issues.apache.org/jira/browse/IO-871
>             Project: Commons IO
>          Issue Type: Bug
>          Components: Utilities
>    Affects Versions: 2.19.0
>            Reporter: Éamonn McManus
>            Assignee: Gary D. Gregory
>            Priority: Minor
>             Fix For: 2.19.0
>
>
> A [recent 
> change|https://github.com/apache/commons-io/commit/c832eb20796b25d8ee2437a8663616b1112cd7bd]
>  to IOUtils.contentEquals(InputStream,InputStream) introduced a bug when at 
> least one of the InputStream instances under-reports the number of available 
> bytes. That is completely allowed by the contract of InputStream. I think the 
> underlying problem may be [this 
> line|https://github.com/apache/commons-io/blob/0d41d2fd958f28a0c4eb21afb6f34be8efa0e4fb/src/main/java/org/apache/commons/io/channels/FileChannels.java#L94]
>  in FileChannels. There's no requirement for a ReadableByteChannel.read to 
> return all available bytes, and therefore it is possible for one of the two 
> reads being compared to be shorter than the other, even though the contents 
> of the two channels are in fact equal.
> This problem showed up when importing the latest source snapshot to Google's 
> internal repository and running all of Google's tests against it. Here is a 
> simple repro:
> {code:java}
>     assertThat(
>             IOUtils.contentEquals(
>                 new ByteArrayInputStream("ab".getBytes()),
>                 new SequenceInputStream(
>                     new ByteArrayInputStream("a".getBytes()),
>                     new ByteArrayInputStream("b".getBytes()))))
>         .isTrue(); {code}
> The assertion passes before this change and fails after it.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to