RFR [9]8134424: BlockDataInputStream.readUTFBody: examine sizing local StringBuffer with the given length

Chris Hegarty chris.hegarty at oracle.com
Wed Feb 10 14:07:51 UTC 2016



On 10/02/16 13:57, Aleksey Shipilev wrote:
> ....
> Um (Integer.MAX_VALUE + 1L) is still a positive long, you probably want:
>
>    int ilen = (int)utflen;
>    if (ilen < 0)
>      return "";
>
>    int initialCapacity = Math.min(ilen, 16384);
>
> ...or:
>
>    if (utflen < 0 || utflen > Integer.MAX_INT)
>      return "";
>
>    int initialCapacity = Math.min((int)utflen, 16384);

Thanks Aleksey, your proposal is better. So the complete change is:

diff --git a/src/java.base/share/classes/java/io/ObjectInputStream.java 
b/src/java.base/share/classes/java/io/ObjectInputStream.java
--- a/src/java.base/share/classes/java/io/ObjectInputStream.java
+++ b/src/java.base/share/classes/java/io/ObjectInputStream.java
@@ -3144,7 +3144,12 @@
           * utflen bytes.
           */
          private String readUTFBody(long utflen) throws IOException {
-            StringBuilder sbuf = new StringBuilder();
+            if (utflen < 0 || utflen > Integer.MAX_VALUE)
+                return "";
+
+            // a reasonable initial capacity based on the UTF length
+            int initialCapacity = Math.min((int)utflen, 16384);
+            StringBuilder sbuf = new StringBuilder(initialCapacity);
              if (!blkmode) {
                  end = pos = 0;
              }

-Chris.



More information about the core-libs-dev mailing list