No public description
PiperOrigin-RevId: 647161068
Change-Id: Icd47a98516d9adb200751938c643e7c7217700f1
diff --git a/current/src/main/java/com/sun/mail/iap/ResponseInputStream.java b/current/src/main/java/com/sun/mail/iap/ResponseInputStream.java
index 7bbba00..9e0ecde 100644
--- a/current/src/main/java/com/sun/mail/iap/ResponseInputStream.java
+++ b/current/src/main/java/com/sun/mail/iap/ResponseInputStream.java
@@ -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);
+ }
}