| See b/349666261, ResponseInputStream can produce OOM. |
| =================================================================== |
| diff --git a/src/main/java/com/sun/mail/iap/ResponseInputStream.java b/src/main/java/com/sun/mail/iap/ResponseInputStream.java |
| --- a/src/main/java/com/sun/mail/iap/ResponseInputStream.java (revision cb7bd7e096d480731b4e28e1ba3ab42f2bc1826a) |
| +++ b/src/main/java/com/sun/mail/iap/ResponseInputStream.java (date 1752488348737) |
| @@ -58,6 +58,9 @@ |
| private static final int maxIncrement = 256 * 1024; |
| private static final int incrementSlop = 16; |
| |
| + private final int inputStreamBufferMaxSize = |
| + Integer.getInteger("com.sun.mail.iap.inputStreamBufferMaxSize", 0); |
| + |
| // where we read from |
| private BufferedInputStream bin; |
| |
| @@ -109,7 +112,7 @@ |
| int incr = buffer.length; |
| if (incr > maxIncrement) |
| incr = maxIncrement; |
| - ba.grow(incr); |
| + checkBeforeGrow(ba, incr); |
| buffer = ba.getBytes(); |
| } |
| buffer[idx++] = (byte)b; |
| @@ -145,7 +148,7 @@ |
| int avail = buffer.length - idx; // available space in buffer |
| if (count + incrementSlop > avail) { |
| // need count-avail more bytes |
| - ba.grow(minIncrement > count + incrementSlop - avail ? |
| + checkBeforeGrow(ba, minIncrement > count + incrementSlop - avail ? |
| minIncrement : count + incrementSlop - avail); |
| buffer = ba.getBytes(); |
| } |
| @@ -179,4 +182,15 @@ |
| public int available() throws IOException { |
| return bin.available(); |
| } |
| -} |
| + |
| + // TODO: b/349666261 - Push for a fix upstream, or deprecate sun_mail. |
| + private void checkBeforeGrow(ByteArray ba, int incr) throws IOException { |
| + if (inputStreamBufferMaxSize > 0 && ba.getBytes().length + incr > inputStreamBufferMaxSize) { |
| + throw new IOException( |
| + String.format( |
| + "Buffer in ResponseInputStream grows too large. Limit: %d, actual: %d", |
| + inputStreamBufferMaxSize, ba.getBytes().length + incr)); |
| + } |
| + ba.grow(incr); |
| + } |
| +} |
| \ No newline at end of file |