You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by "Colm O hEigeartaigh (JIRA)" <ji...@apache.org> on 2012/07/31 13:16:34 UTC

[jira] [Commented] (SANTUARIO-334) UnsyncByteArrayOutputStream hangs on messages larger 512 MB

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

Colm O hEigeartaigh commented on SANTUARIO-334:
-----------------------------------------------


I applied a fix for this - could you test with the latest SNAPSHOT code? The loop now only doubles in size (rather than quadruples), and uses Integer.MAX_VALUE if newSize is less than zero. There are also separate checks to throw OutOfMemoryErrors.

Colm.
                
> UnsyncByteArrayOutputStream hangs on messages larger 512 MB
> -----------------------------------------------------------
>
>                 Key: SANTUARIO-334
>                 URL: https://issues.apache.org/jira/browse/SANTUARIO-334
>             Project: Santuario
>          Issue Type: Bug
>          Components: Java
>    Affects Versions: Java 1.5.2
>         Environment: Windows 7
>            Reporter: Torsten Keim
>            Assignee: Colm O hEigeartaigh
>             Fix For: Java 1.4.8, Java 1.5.3
>
>
> If we check the signature of a message larger than 512 MB, the method expandSize(int newPos) of class org.apache.xml.security.utils.UnsyncByteArrayOutputStream goes in an endless loop, i.e. it hangs.
> The following lines show the endless loop:
> while (newPos > newSize) {
>  	newSize = newSize << 2;
> }
> Initially the size is 8 KB and after several bit shifts by 2 (equal to multiplication with 4) the size is 512 MB. If 512 MB is multiplied with 4 it comes to an overflow: 512*1024*1024 << 2 = -2147483648, which is Integer.MIN_VALUE.
> One solution would be to change the used types from int to long.
> If we stay with datatype int, we could improve the implementation:
> while (newPos > newSize) {
>  	newSize = (newSize < (512*1024*1024)) ? (newSize << 2) :Integer.MAX_VALUE ;
> }
> This would work with message up to 2 GB. Messages greater than 2 GB would still fail.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira