Summary
Amend the specification of the JNI function NewDirectByteBuffer to specify that IllegalArgumentException is thrown when the value of the capacity parameter is negative or greater than Integer.MAX_VALUE.
Problem
The JNI function NewDirectByteBuffer is specified to have a jlong capacity parameter, but the corresponding java.net.ByteBuffer class only has an int capacity. The behavior of NewDirectByteBuffer is undefined if its long-valued capacity parameter is out of range for an int value. If the value of (int)capacity is negative, then an IllegalArgumentException is thrown. If however capacity != (int)capacity and (int)capacity > 0, then a direct buffer of an unexpected size will be allocated. This occurs for example if capacity equals 5000000000L in which case (int)capacity equals 705032704.
Solution
Change NewDirectByteBuffer to throw IllegalArgumentException if capacity < 0 or capacity > Integer.MAX_VALUE.
Specification
@@ -3668,20 +3668,24 @@
`env`: the JNI interface pointer, must not be `NULL`.
`address`: the starting address of the memory region, must not be `NULL`.
-`capacity`: the size in bytes of the memory region, must be positive.
+`capacity`: the size in bytes of the memory region, must be nonnegative and
+less than or equal to `Integer.MAX_VALUE`
#### RETURNS:
Returns a local reference to the newly-instantiated `java.nio.ByteBuffer`
object. Returns `NULL` if an exception occurs, or if JNI access to direct
buffers is not supported by this virtual machine.
#### THROWS:
+`IllegalArgumentException`: if `capacity` is negative or greater than
+`Integer.MAX_VALUE`
+
`OutOfMemoryError`: if allocation of the `ByteBuffer` object fails
- csr of
-
JDK-8299684 (bf) JNI direct buffer functions with large capacity behave unexpectedly
-
- Closed
-