Skip to content

Commit da228e0

Browse files
committed
8357145: CRC/Inflater/Deflater/Adler32 methods that take a ByteBuffer throw UOE if backed by shared memory segment
Reviewed-by: alanb
1 parent d4b923d commit da228e0

File tree

7 files changed

+44
-28
lines changed

7 files changed

+44
-28
lines changed

src/java.base/share/classes/java/util/zip/Adler32.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1996, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -29,7 +29,6 @@
2929

3030
import jdk.internal.util.Preconditions;
3131
import jdk.internal.vm.annotation.IntrinsicCandidate;
32-
import sun.nio.ch.DirectBuffer;
3332

3433
import static java.util.zip.ZipUtils.NIO_ACCESS;
3534

@@ -100,7 +99,7 @@ public void update(ByteBuffer buffer) {
10099
if (buffer.isDirect()) {
101100
NIO_ACCESS.acquireSession(buffer);
102101
try {
103-
adler = updateByteBuffer(adler, ((DirectBuffer)buffer).address(), pos, rem);
102+
adler = updateByteBuffer(adler, NIO_ACCESS.getBufferAddress(buffer), pos, rem);
104103
} finally {
105104
NIO_ACCESS.releaseSession(buffer);
106105
}

src/java.base/share/classes/java/util/zip/CRC32.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1996, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -28,7 +28,6 @@
2828
import java.nio.ByteBuffer;
2929
import java.util.Objects;
3030

31-
import sun.nio.ch.DirectBuffer;
3231
import jdk.internal.util.Preconditions;
3332
import jdk.internal.vm.annotation.IntrinsicCandidate;
3433

@@ -99,7 +98,7 @@ public void update(ByteBuffer buffer) {
9998
if (buffer.isDirect()) {
10099
NIO_ACCESS.acquireSession(buffer);
101100
try {
102-
crc = updateByteBuffer(crc, ((DirectBuffer)buffer).address(), pos, rem);
101+
crc = updateByteBuffer(crc, NIO_ACCESS.getBufferAddress(buffer), pos, rem);
103102
} finally {
104103
NIO_ACCESS.releaseSession(buffer);
105104
}

src/java.base/share/classes/java/util/zip/CRC32C.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
* or visit www.oracle.com if you need additional information or have any
2323
* questions.
2424
*/
25+
2526
package java.util.zip;
2627

2728
import java.nio.ByteBuffer;
@@ -30,7 +31,6 @@
3031
import jdk.internal.misc.Unsafe;
3132
import jdk.internal.util.Preconditions;
3233
import jdk.internal.vm.annotation.IntrinsicCandidate;
33-
import sun.nio.ch.DirectBuffer;
3434

3535
import static java.util.zip.ZipUtils.NIO_ACCESS;
3636

@@ -176,7 +176,7 @@ public void update(ByteBuffer buffer) {
176176
if (buffer.isDirect()) {
177177
NIO_ACCESS.acquireSession(buffer);
178178
try {
179-
crc = updateDirectByteBuffer(crc, ((DirectBuffer)buffer).address(),
179+
crc = updateDirectByteBuffer(crc, NIO_ACCESS.getBufferAddress(buffer),
180180
pos, limit);
181181
} finally {
182182
NIO_ACCESS.releaseSession(buffer);

src/java.base/share/classes/java/util/zip/Deflater.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import jdk.internal.ref.CleanerFactory;
3434
import jdk.internal.util.Preconditions;
35-
import sun.nio.ch.DirectBuffer;
3635

3736
import static java.util.zip.ZipUtils.NIO_ACCESS;
3837

@@ -322,7 +321,7 @@ public void setDictionary(ByteBuffer dictionary) {
322321
if (dictionary.isDirect()) {
323322
NIO_ACCESS.acquireSession(dictionary);
324323
try {
325-
long address = ((DirectBuffer) dictionary).address();
324+
long address = NIO_ACCESS.getBufferAddress(dictionary);
326325
setDictionaryBuffer(zsRef.address(), address + position, remaining);
327326
} finally {
328327
NIO_ACCESS.releaseSession(dictionary);
@@ -577,7 +576,7 @@ public int deflate(byte[] output, int off, int len, int flush) {
577576
if (input.isDirect()) {
578577
NIO_ACCESS.acquireSession(input);
579578
try {
580-
long inputAddress = ((DirectBuffer) input).address();
579+
long inputAddress = NIO_ACCESS.getBufferAddress(input);
581580
result = deflateBufferBytes(zsRef.address(),
582581
inputAddress + inputPos, inputRem,
583582
output, off, len,
@@ -701,7 +700,7 @@ public int deflate(ByteBuffer output, int flush) {
701700
if (output.isDirect()) {
702701
NIO_ACCESS.acquireSession(output);
703702
try {
704-
long outputAddress = ((DirectBuffer) output).address();
703+
long outputAddress = NIO_ACCESS.getBufferAddress(output);
705704
result = deflateBytesBuffer(zsRef.address(),
706705
inputArray, inputPos, inputLim - inputPos,
707706
outputAddress + outputPos, outputRem,
@@ -723,11 +722,11 @@ public int deflate(ByteBuffer output, int flush) {
723722
if (input.isDirect()) {
724723
NIO_ACCESS.acquireSession(input);
725724
try {
726-
long inputAddress = ((DirectBuffer) input).address();
725+
long inputAddress = NIO_ACCESS.getBufferAddress(input);
727726
if (output.isDirect()) {
728727
NIO_ACCESS.acquireSession(output);
729728
try {
730-
long outputAddress = outputPos + ((DirectBuffer) output).address();
729+
long outputAddress = outputPos + NIO_ACCESS.getBufferAddress(output);
731730
result = deflateBufferBuffer(zsRef.address(),
732731
inputAddress + inputPos, inputRem,
733732
outputAddress, outputRem,
@@ -752,7 +751,7 @@ public int deflate(ByteBuffer output, int flush) {
752751
if (output.isDirect()) {
753752
NIO_ACCESS.acquireSession(output);
754753
try {
755-
long outputAddress = ((DirectBuffer) output).address();
754+
long outputAddress = NIO_ACCESS.getBufferAddress(output);
756755
result = deflateBytesBuffer(zsRef.address(),
757756
inputArray, inputOffset + inputPos, inputRem,
758757
outputAddress + outputPos, outputRem,

src/java.base/share/classes/java/util/zip/Inflater.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import jdk.internal.ref.CleanerFactory;
3434
import jdk.internal.util.Preconditions;
35-
import sun.nio.ch.DirectBuffer;
3635

3736
import static java.util.zip.ZipUtils.NIO_ACCESS;
3837

@@ -243,7 +242,7 @@ public void setDictionary(ByteBuffer dictionary) {
243242
if (dictionary.isDirect()) {
244243
NIO_ACCESS.acquireSession(dictionary);
245244
try {
246-
long address = ((DirectBuffer) dictionary).address();
245+
long address = NIO_ACCESS.getBufferAddress(dictionary);
247246
setDictionaryBuffer(zsRef.address(), address + position, remaining);
248247
} finally {
249248
NIO_ACCESS.releaseSession(dictionary);
@@ -366,7 +365,7 @@ public int inflate(byte[] output, int off, int len)
366365
if (input.isDirect()) {
367366
NIO_ACCESS.acquireSession(input);
368367
try {
369-
long inputAddress = ((DirectBuffer) input).address();
368+
long inputAddress = NIO_ACCESS.getBufferAddress(input);
370369
result = inflateBufferBytes(zsRef.address(),
371370
inputAddress + inputPos, inputRem,
372371
output, off, len);
@@ -503,7 +502,7 @@ public int inflate(ByteBuffer output) throws DataFormatException {
503502
if (output.isDirect()) {
504503
NIO_ACCESS.acquireSession(output);
505504
try {
506-
long outputAddress = ((DirectBuffer) output).address();
505+
long outputAddress = NIO_ACCESS.getBufferAddress(output);
507506
result = inflateBytesBuffer(zsRef.address(),
508507
inputArray, inputPos, inputLim - inputPos,
509508
outputAddress + outputPos, outputRem);
@@ -528,11 +527,11 @@ public int inflate(ByteBuffer output) throws DataFormatException {
528527
if (input.isDirect()) {
529528
NIO_ACCESS.acquireSession(input);
530529
try {
531-
long inputAddress = ((DirectBuffer) input).address();
530+
long inputAddress = NIO_ACCESS.getBufferAddress(input);
532531
if (output.isDirect()) {
533532
NIO_ACCESS.acquireSession(output);
534533
try {
535-
long outputAddress = ((DirectBuffer) output).address();
534+
long outputAddress = NIO_ACCESS.getBufferAddress(output);
536535
result = inflateBufferBuffer(zsRef.address(),
537536
inputAddress + inputPos, inputRem,
538537
outputAddress + outputPos, outputRem);
@@ -555,7 +554,7 @@ public int inflate(ByteBuffer output) throws DataFormatException {
555554
if (output.isDirect()) {
556555
NIO_ACCESS.acquireSession(output);
557556
try {
558-
long outputAddress = ((DirectBuffer) output).address();
557+
long outputAddress = NIO_ACCESS.getBufferAddress(output);
559558
result = inflateBytesBuffer(zsRef.address(),
560559
inputArray, inputOffset + inputPos, inputRem,
561560
outputAddress + outputPos, outputRem);

test/jdk/java/util/zip/ChecksumBase.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -21,21 +21,23 @@
2121
* questions.
2222
*/
2323

24-
/**
25-
* Base class for Checksum tests
26-
*/
24+
import java.lang.foreign.MemorySegment;
2725
import java.nio.ByteBuffer;
2826
import java.nio.ByteOrder;
2927
import java.nio.charset.StandardCharsets;
3028
import java.util.zip.Checksum;
3129

30+
/**
31+
* Base class for Checksum tests
32+
*/
3233
public class ChecksumBase {
3334

3435
private static final byte[] BYTES_123456789 = "123456789".getBytes(StandardCharsets.US_ASCII);
3536

3637
public static void testAll(Checksum checksum, long expected) {
3738
testBytes(checksum, expected);
3839
testByteArray(checksum, expected);
40+
testWrappedMemorySegment(checksum, expected);
3941
testWrappedByteBuffer(checksum, expected);
4042
testReadonlyByteBuffer(checksum, expected);
4143
testDirectByteBuffer(checksum, expected);
@@ -69,6 +71,13 @@ private static void testWrappedByteBuffer(Checksum checksum, long expected) {
6971
checkChecksum(checksum, expected);
7072
}
7173

74+
private static void testWrappedMemorySegment(Checksum checksum, long expected) {
75+
checksum.reset();
76+
ByteBuffer bb = MemorySegment.ofArray(BYTES_123456789).asByteBuffer();
77+
checksum.update(bb);
78+
checkChecksum(checksum, expected);
79+
}
80+
7281
private static void testReadonlyByteBuffer(Checksum checksum, long expected) {
7382
checksum.reset();
7483
ByteBuffer bb = ByteBuffer.wrap(BYTES_123456789).asReadOnlyBuffer();

test/jdk/java/util/zip/DeInflate.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@
2121
* questions.
2222
*/
2323

24-
/**
24+
/*
2525
* @test
26-
* @bug 7110149 8184306 6341887
26+
* @bug 7110149 8184306 6341887 8357145
2727
* @summary Test basic deflater & inflater functionality
2828
* @key randomness
2929
*/
3030

3131
import java.io.*;
32+
import java.lang.foreign.Arena;
3233
import java.nio.*;
3334
import java.util.*;
3435
import java.util.zip.*;
@@ -203,6 +204,16 @@ static void check(Deflater def, byte[] in, int len, boolean nowrap)
203204
bbOut2 = ByteBuffer.allocateDirect(out2.length);
204205
checkByteBuffer(def, inf, bbIn, bbOut1, bbOut2, in, len, out2, false);
205206
checkByteBufferReadonly(def, inf, bbIn, bbOut1, bbOut2);
207+
208+
// segment
209+
try (var arena = Arena.ofConfined()) {
210+
bbIn = arena.allocate(in.length).asByteBuffer();
211+
bbIn.put(in, 0, n).flip();
212+
bbOut1 = arena.allocate(out1.length).asByteBuffer();
213+
bbOut2 = arena.allocate(out2.length).asByteBuffer();
214+
checkByteBuffer(def, inf, bbIn, bbOut1, bbOut2, in, len, out2, false);
215+
checkByteBufferReadonly(def, inf, bbIn, bbOut1, bbOut2);
216+
}
206217
}
207218

208219
static void checkDict(Deflater def, Inflater inf, byte[] src,

0 commit comments

Comments
 (0)