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 2016/11/09 11:16:58 UTC
[jira] [Resolved] (SANTUARIO-459) Wrong usage of Integer.MAX_VALUE
[ https://issues.apache.org/jira/browse/SANTUARIO-459?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Colm O hEigeartaigh resolved SANTUARIO-459.
-------------------------------------------
Resolution: Fixed
> Wrong usage of Integer.MAX_VALUE
> --------------------------------
>
> Key: SANTUARIO-459
> URL: https://issues.apache.org/jira/browse/SANTUARIO-459
> Project: Santuario
> Issue Type: Bug
> Environment: Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
> IBM J9 VM (build 2.8, JRE 1.8.0 Linux amd64-64
> Apache XML Security 2.0.7
> Reporter: Ronald Boettcher
> Assignee: Colm O hEigeartaigh
> Priority: Minor
> Fix For: Java 2.0.8, Java 2.1.0
>
>
> Most Java VMs are throwing a "Requested array size exceeds VM limit" OutOfMemoryException when using just Integer.MAX_VALUE or Integer.MAX_VALUE - 1
> We are using Apache Santuario XML Encryption with large documents and encountered this problem.
> I had to change it in org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java.
> The patch file content is as following (I'm missing an attachment button):
> {code:title=UnsyncByteArrayOutputStream.java.patch|borderStyle=solid}
> *** src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java.orig 2016-09-30 11:59:49.570187935 +0200
> --- src/main/java/org/apache/xml/security/utils/UnsyncByteArrayOutputStream.java 2016-09-30 11:59:31.149998245 +0200
> ***************
> *** 28,33 ****
> --- 28,37 ----
> public class UnsyncByteArrayOutputStream extends OutputStream {
>
> private static final int INITIAL_SIZE = 8192;
> +
> + // most Java VMs are throwing a "Requested array size exceeds VM limit" OutOfMemoryException
> + // when using just Integer.MAX_VALUE or Integer.MAX_VALUE - 1
> + private static final int VM_ARRAY_INDEX_MAX_VALUE = Integer.MAX_VALUE - 2;
>
> private byte[] buf;
> private int size = INITIAL_SIZE;
> ***************
> *** 38,44 ****
> }
>
> public void write(byte[] arg0) {
> ! if ((Integer.MAX_VALUE - pos) < arg0.length) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + arg0.length;
> --- 42,48 ----
> }
>
> public void write(byte[] arg0) {
> ! if ((VM_ARRAY_INDEX_MAX_VALUE - pos) < arg0.length) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + arg0.length;
> ***************
> *** 50,56 ****
> }
>
> public void write(byte[] arg0, int arg1, int arg2) {
> ! if ((Integer.MAX_VALUE - pos) < arg2) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + arg2;
> --- 54,60 ----
> }
>
> public void write(byte[] arg0, int arg1, int arg2) {
> ! if ((VM_ARRAY_INDEX_MAX_VALUE - pos) < arg2) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + arg2;
> ***************
> *** 62,68 ****
> }
>
> public void write(int arg0) {
> ! if (Integer.MAX_VALUE - pos == 0) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + 1;
> --- 66,72 ----
> }
>
> public void write(int arg0) {
> ! if (VM_ARRAY_INDEX_MAX_VALUE - pos == 0) {
> throw new OutOfMemoryError();
> }
> int newPos = pos + 1;
> ***************
> *** 88,94 ****
> newSize = newSize << 1;
> // Deal with overflow
> if (newSize < 0) {
> ! newSize = Integer.MAX_VALUE;
> }
> }
> byte newBuf[] = new byte[newSize];
> --- 92,98 ----
> newSize = newSize << 1;
> // Deal with overflow
> if (newSize < 0) {
> ! newSize = VM_ARRAY_INDEX_MAX_VALUE;
> }
> }
> byte newBuf[] = new byte[newSize];
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)