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

Amos Shi ashi at openjdk.org
Thu Mar 14 08:10:10 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
>   - Passed on Windows 11
>     - `test/jdk/java/lang/String/CompactString/NegativeSize.java` - Test results: passed: 1
> 
> Processor	12th Gen Intel(R) Core(TM) i7-12800H   2.40 GHz
> Installed RAM	64.0 GB (63.7 GB usable)
> System type	64-bit operating system, x64-ba...

Amos Shi has updated the pull request incrementally with one additional commit since the last revision:

  Fix compile error: unmappable character for encoding windows-1252

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

Changes:
  - all: https://git.openjdk.org/jdk17u-dev/pull/2279/files
  - new: https://git.openjdk.org/jdk17u-dev/pull/2279/files/2b4329e4..0bf1e5f0

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk17u-dev&pr=2279&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk17u-dev&pr=2279&range=00-01

  Stats: 1 line in 1 file changed: 1 ins; 0 del; 0 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