No public description
PiperOrigin-RevId: 782944922
Change-Id: I940c3df2660716c774252f3304f71916ac2d4aca
diff --git a/patches/02.input_stream_max_buffer_size.patch b/patches/02.input_stream_max_buffer_size.patch
new file mode 100644
index 0000000..55921b1
--- /dev/null
+++ b/patches/02.input_stream_max_buffer_size.patch
@@ -0,0 +1,51 @@
+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
diff --git a/patches/series b/patches/series
index eb400ee..1f1878a 100644
--- a/patches/series
+++ b/patches/series
@@ -1 +1,2 @@
01.unicode_check.patch
+02.input_stream_max_buffer_size.patch
\ No newline at end of file