RFR: 8153490: Cannot setBytes() if incoming buffer's length is bigger than number of elements we want to insert. [v3]
Lance Andersen
lancea at openjdk.java.net
Tue May 18 19:07:23 UTC 2021
On Mon, 17 May 2021 14:39:05 GMT, Mitsuru Kariya <github.com+2217224+kariya-mitsuru at openjdk.org> wrote:
>> Fix `SerialBlob.setBytes(long pos, byte[] bytes, int offset, int length)` in the following cases:
>>
>> 1. `pos - 1 + bytes.length - offset > this.length() && pos - 1 + length <= this.length()`
>> The original implementation throws `ArrayIndexOutOfBoundsException` but this case should end successfully.
>> (test31)
>>
>> 2. `pos - 1 + length > this.length()`
>> The original implementation throws `ArrayIndexOutOfBoundsException` but this case should end successfully. *1
>> (test32)
>>
>> 3. `pos == this.length() + 1`
>> The original implementation throws `SerialException` but this case should end successfully. *2
>> (test33)
>>
>> 4. `length < 0`
>> The original implementation throws `ArrayIndexOutOfBoundsException` but this case should throw `SerialException`.
>> (test34)
>>
>> 5. `offset + length > Integer.MAX_VALUE`
>> The original implementation throws `ArrayIndexOutOfBoundsException` (or `OutOfMemoryError` in most cases) but this case should throw `SerialException`.
>> (test35)
>>
>> Additionally, fix `SerialClob.setString(long pos, String str, int offset, int length)` in the following cases:
>>
>> 1. `offset > str.length()`
>> The original implementaion throws `StringIndexOutOfBoundsException` but this case should throw `SerialException`.
>> (test39)
>>
>> 2. `pos - 1 + str.length() - offset > this.length() && pos - 1 + length <= this.length()`
>> The original implementation throws `ArrayIndexOutOfBoundsException` but this case should end successfully.
>> (test32)
>>
>> 3. `pos - 1 + length > this.length()`
>> The original implementaion throws `SerialException` but this case should end successfully. *3
>> (test40)
>>
>> 4. `pos == this.length() + 1`
>> The original implementaion throws `SerialException` but this case should end successfully. *4
>> (test41)
>>
>> 5. `length < 0`
>> The original implementation throws `StringIndexOutOfBoundsException` but this case should throw `SerialException`.
>> (test42)
>>
>> 6. `offset + length > Integer.MAX_VALUE`
>> The original implementation throws `ArrayIndexOutOfBoundsException` (or `OutOfMemoryError` in most cases) but this case should throw `SerialException`.
>> (test43)
>>
>>
>> The javadoc has also been modified according to the above.
>>
>> *1 The documentation of `Blob.setBytes()` says, "If the end of the Blob value is reached while writing the array of bytes, then the length of the Blob value will be increased to accommodate the extra bytes."
>>
>> *2 The documentation of `Blob.setBytes()` says, "If the value specified for pos is greater than the length+1 of the BLOB value then the behavior is undefined."
>> So, it should work correctly when pos == length+1 of the BLOB value.
>>
>> *3 The documentation of `Clob.setString()` says, "If the end of the Clob value is eached while writing the given string, then the length of the Clob value will be increased to accommodate the extra characters."
>>
>> *4 The documentation of `Clob.setString()` says, "If the value specified for pos is greater than the length+1 of the CLOB value then the behavior is undefined."
>> So, it should work correctly when pos == length+1 of the CLOB value.
>
> Mitsuru Kariya has updated the pull request incrementally with one additional commit since the last revision:
>
> Fix for length + offset > Integer.MAX_VALUE case
Overall the changes look reasonable. As mentioned in the comments, a CSR will be required due to some of the wordsmithing cleanup
src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java line 306:
> 304: *
> 305: * @param pos the position in the SQL <code>BLOB</code> value at which
> 306: * to start writing. The first position is <code>1</code>;
When updating the javadoc to use @code, please update all instances for consistency
src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java line 308:
> 306: * to start writing. The first position is <code>1</code>;
> 307: * must not be less than <code>1</code> nor greater than
> 308: * the length+1 of this {@code SerialBlob} object.
Changes such as this require a CSR. I think I have convinced myself that it is OK to move forward with the CSR.
src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java line 313:
> 311: * @return the number of bytes written
> 312: * @throws SerialException if there is an error accessing the
> 313: * {@code BLOB} value; or if an invalid position is set;
Even though this addresses a typo, this will require a CSR
-------------
Changes requested by lancea (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/4001
More information about the core-libs-dev
mailing list