[jdk17u-dev] RFR: 8320570: NegativeArraySizeException decoding >1G UTF8 bytes with non-ascii characters

Amos Shi ashi at openjdk.org
Fri Mar 8 23:06:04 UTC 2024


Backport of [JDK-8320570](https://bugs.openjdk.org/browse/JDK-8320570)
- `NegativeSize.java` - Clean backport
- `String.java` - 3 sections change are unclean, the rest are clean. Details as bellow.
- This PR contains 2 commits
  - The commit 1: is a clean backport part
  - The commit 2: is a manual fix of the following 3 sections, 
    - Replace all `new byte[length << 1]` as `StringUTF16.newBytesFor(length)`


@@ -592,7 +592,7 @@
                     this.coder = LATIN1;
                     return;
                 }
-                byte[] utf16 = new byte[length << 1];
+                byte[] utf16 = StringUTF16.newBytesFor(length);
                 StringLatin1.inflate(latin1, 0, utf16, 0, dp);
                 dp = decodeUTF8_UTF16(latin1, sp, length, utf16, dp, true);
                 if (dp != length) {



@@ -601,7 +601,7 @@
                 this.value = utf16;
                 this.coder = UTF16;
             } else { // !COMPACT_STRINGS
-                byte[] dst = new byte[length << 1];
+                byte[] dst = StringUTF16.newBytesFor(length);
                 int dp = decodeUTF8_UTF16(bytes, offset, offset + length, dst, 0, true);
                 if (dp != length) {
                     dst = Arrays.copyOf(dst, dp << 1);



@@ -730,15 +730,15 @@
                 return new String(dst, LATIN1);
             }
             if (dp == 0) {
-                dst = new byte[length << 1];
+                dst = StringUTF16.newBytesFor(length);
             } else {
-                byte[] buf = new byte[length << 1];
+                byte[] buf = StringUTF16.newBytesFor(length);
                 StringLatin1.inflate(dst, 0, buf, 0, dp);
                 dst = buf;
             }
             dp = decodeUTF8_UTF16(bytes, offset, sl, dst, dp, false);
         } else { // !COMPACT_STRINGS
-            dst = new byte[length << 1];
+            dst = StringUTF16.newBytesFor(length);
             dp = decodeUTF8_UTF16(bytes, offset, offset + length, dst, 0, false);
         }
         if (dp != length) {


- So this PR can be considered as `semantics clean`


Testing
- Local: Passed on MacOS M1 laptop
  - `test/jdk/java/lang/String/CompactString/NegativeSize.java` - Test results: passed: 1
- Pipeline: 
- Testing Machine:

-------------

Commit messages:
 - Manual merge the line to jdk17u-dev
 - Backport 82796bdebbf56b98ec97a6d572ed68c2842f60c6

Changes: https://git.openjdk.org/jdk17u-dev/pull/2279/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk17u-dev&pr=2279&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8320570
  Stats: 81 lines in 2 files changed: 75 ins; 0 del; 6 mod
  Patch: https://git.openjdk.org/jdk17u-dev/pull/2279.diff
  Fetch: git fetch https://git.openjdk.org/jdk17u-dev.git pull/2279/head:pull/2279

PR: https://git.openjdk.org/jdk17u-dev/pull/2279


More information about the jdk-updates-dev mailing list