Issue Details (XML | Word | Printable)

Key: DERBY-4060
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Kristian Waagan
Reporter: Trejkaz
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Derby

Blob.getBinaryStream(long,long) is off by one for the pos+len check

Created: 16/Feb/09 10:00 PM   Updated: 04/May/09 06:21 PM
Component/s: JDBC, Network Client
Affects Version/s: 10.3.3.1, 10.4.2.0, 10.5.1.1
Fix Version/s: 10.3.3.1, 10.4.2.1, 10.5.1.1

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works derby-4060-1a-sub_stream_fix.diff 2009-02-26 11:44 AM Kristian Waagan 15 kB
File Licensed for inclusion in ASF works derby-4060-1a-sub_stream_fix.stat 2009-02-26 11:44 AM Kristian Waagan 0.5 kB
File Licensed for inclusion in ASF works derby-4060-1b-sub_stream_fix.diff 2009-03-02 08:48 AM Kristian Waagan 15 kB
File Licensed for inclusion in ASF works derby-4060-2a-doc_changes.diff 2009-03-04 11:02 AM Kristian Waagan 4 kB

Urgency: Normal
Resolution Date: 09/Mar/09 09:54 AM


 Description  « Hide
If you have a BLOB of length 20, and call blob.getBinaryStream(11,10), it will give you an error:

    java.sql.SQLException: Sum of position('11') and length('10') is greater than the size of the LOB.

This is following word for word an error in the JDBC Javadoc:

        SQLException - if pos is less than 1 or if pos is greater than the number of bytes in the Blob or if pos + length is greater than the number of bytes in the Blob

So it's checking 11 + 10 > 20, but it should check 11 + 10 > 21 (pos + len > blob.length() + 1) to allow reading the last byte.

The Javadoc for Clob.getCharacterStream(long,long) has similar wording so it may have the same issue.

Likewise, the client driver may have the same issue -- I haven't yet checked.



 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Repository Revision Date User Message
ASF #749235 Mon Mar 02 08:47:52 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Changed the pos/length checks to allow obtaining a stream reading the last
byte/char from the LOB.
The JavaDoc for Blob.getBinaryStream(long,long) and
Clob.getCharacterStream(long,long) (JDBC 4.0) incorrectly states that the
position plus the requested length of the stream cannot be larger than the
length of the LOB. Since positions in JDBC are 1-based, this makes it impossible
to read the last byte/char in the LOB. Derby adhered to the spec.

The changes to CharAlphabet/LoopingAlphabetReader were done to allow passing
an alphabet object around for constructing streams.
Patch file: DERBY-4060-1b-sub_stream_fix.diff
Files Changed
MODIFY /db/derby/code/trunk/java/client/org/apache/derby/client/am/Lob.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/streams/LoopingAlphabetReader.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/util/streams/CharAlphabet.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/BlobTest.java
MODIFY /db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ClobTest.java

Repository Revision Date User Message
ASF #750409 Thu Mar 05 10:23:18 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Merged fix and tests from trunk (revision 749235).
Files Changed
MODIFY /db/derby/code/branches/10.4/java/client/org/apache/derby/client/am/Lob.java
MODIFY /db/derby/code/branches/10.4/java/testing/org/apache/derbyTesting/functionTests/util/streams/LoopingAlphabetReader.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/branches/10.4/java/testing/org/apache/derbyTesting/functionTests/util/streams/CharAlphabet.java
MODIFY /db/derby/code/branches/10.4/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/BlobTest.java
MODIFY /db/derby/code/branches/10.4/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ClobTest.java

Repository Revision Date User Message
ASF #750410 Thu Mar 05 10:23:49 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Merged fix and tests from trunk (revision 749235).
Files Changed
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ClobTest.java
MODIFY /db/derby/code/branches/10.3/java/client/org/apache/derby/client/am/Lob.java
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/util/streams/LoopingAlphabetReader.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/util/streams/CharAlphabet.java
MODIFY /db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/BlobTest.java

Repository Revision Date User Message
ASF #751637 Mon Mar 09 09:44:44 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Changes to the JavaDoc and one error message, to better describe the error situation.
Patch file: DERBY-4060-2a-doc_changes.diff
Files Changed
MODIFY /db/derby/code/trunk/java/client/org/apache/derby/client/am/Blob.java
MODIFY /db/derby/code/trunk/java/client/org/apache/derby/client/am/Clob.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml

Repository Revision Date User Message
ASF #751639 Mon Mar 09 09:52:11 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Backported doc fix from trunk (revision 751637).
Files Changed
MODIFY /db/derby/code/branches/10.4/java/client/org/apache/derby/client/am/Blob.java
MODIFY /db/derby/code/branches/10.4/java/client/org/apache/derby/client/am/Clob.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/branches/10.4/java/engine/org/apache/derby/loc/messages.xml

Repository Revision Date User Message
ASF #751640 Mon Mar 09 09:52:49 UTC 2009 kristwaa DERBY-4060: Blob.getBinaryStream(long,long) is off by one for the pos+len check.
Backported doc fix from trunk (revision 751637).
Files Changed
MODIFY /db/derby/code/branches/10.3/java/client/org/apache/derby/client/am/Blob.java
MODIFY /db/derby/code/branches/10.3/java/client/org/apache/derby/client/am/Clob.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedBlob.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedClob.java
MODIFY /db/derby/code/branches/10.3/java/engine/org/apache/derby/loc/messages.xml