[ http://issues.apache.org/jira/browse/DERBY-1533?page=all ]
Bryan Pendleton updated DERBY-1533:
-----------------------------------
Attachment: ddmreader1.diff
I know I said I wasn't going to work on this bug until after I returned from
vacation, but those darned DRDA protocol bugs are just too much fun! (Besides,
I got my packing done early).
I need to work up a complete proposal, with detailed notes, javadoc changes,
regression tests, and so forth, and of course run the full regression suite,
but attached is 'ddmreader1.diff' which is the core of a possible fix.
I think there are two basic issues here:
1) DDMReader.compressBLayerData seems to have a few small bugs involving the
mechanics of de-segmenting a multi-segment message. I believe that the almost
identical routine in the network client (Reply.compressBLayerData()) is
correct, so I just made the two routines match.
2) The network client appears to decide whether to flow a large byte array as
inline data or as externalized data based on its length; if the data is less
than 32767 bytes long it is flowed inline (see line 1164 or so in
NetStatementRequest.java). However, the network server was not mirroring that
logic, and sometimes decided to parse an incoming byte array as externalized
data even though the network client had sent it inline.
In early August, I will follow-up this patch with a complete patch, but if
anybody has the time to review this code before then, that would be great!
> ArrayIndexOutOfBoundsException in DDMReader, on a specific data size
> --------------------------------------------------------------------
>
> Key: DERBY-1533
> URL: http://issues.apache.org/jira/browse/DERBY-1533
> Project: Derby
> Issue Type: Bug
> Components: Network Server
> Affects Versions: 10.1.2.1, 10.1.3.1
> Environment: --------- Derby Network Server Information --------
> Version: CSS10011/10.1.3.1 Build: 417277 DRDA Product Id: CSS10011
> -- listing properties --
> derby.drda.maxThreads=0
> derby.drda.keepAlive=true
> derby.drda.minThreads=0
> derby.drda.portNumber=1527
> derby.drda.logConnections=false
> derby.drda.timeSlice=0
> derby.drda.startNetworkServer=false
> derby.drda.host=localhost
> derby.drda.traceAll=false
> ------------------ Java Information ------------------
> Java Version: 1.4.2_08
> Java Vendor: Sun Microsystems Inc.
> OS name: Windows XP
> OS architecture: x86
> OS version: 5.1
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.4
> --------- Derby Information --------
> JRE - JDBC: J2SE 1.4.2 - JDBC 3.0
> [C:\dev\derby\lib\derby.jar] 10.1.3.1 - (417277)
> [C:\dev\derby\lib\derbytools.jar] 10.1.3.1 - (417277)
> [C:\dev\derby\lib\derbynet.jar] 10.1.3.1 - (417277)
> ------------------------------------------------------
> Reporter: Wiktor Lisowicz
> Attachments: ddmreader1.diff, DerbyTest.java, DerbyTest2.java
>
>
> As far as I know, this bug is not related to DERBY-428 bug.
> I got this bug both on 10.1.3.1 and 10.1.2.1 - an
> ArrayIndexOutOfBoundsException in DDMReader (in Network Server).
> To reproduce the bug:
> 1. Compile the attached DerbyTest.java
> 2. Start the Network Server (startNetworkServer.bat under Windows)
> 3. Run: java DerbyTest
> On client side you get:
> org.apache.derby.client.am.DisconnectException: The DDM object is not
> supported. Unsupported DDM object code point: 0x0
> at
> org.apache.derby.client.net.NetConnectionReply.doObjnsprmSemantics(Unknown
> Source)
> at
> org.apache.derby.client.net.NetConnectionReply.parseCommonError(Unknown
> Source)
> at
> org.apache.derby.client.net.NetStatementReply.parseExecuteError(Unknown
> Source)
> at
> org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Unknown
> Source)
> at org.apache.derby.client.net.NetStatementReply.readExecute(Unknown
> Source)
> at org.apache.derby.client.net.StatementReply.readExecute(Unknown
> Source)
> at
> org.apache.derby.client.net.NetPreparedStatement.readExecute_(Unknown Source)
> at org.apache.derby.client.am.PreparedStatement.readExecute(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.executeX(Unknown
> Source)
> at org.apache.derby.client.am.PreparedStatement.execute(Unknown
> Source)
> at DerbyTest.main(DerbyTest.java:479)
> On server side you get:
> java.lang.ArrayIndexOutOfBoundsException
> at java.lang.System.arraycopy(Native Method)
> at org.apache.derby.impl.drda.DDMReader.compressBLayerData(Unknown
> Source)
> at
> org.apache.derby.impl.drda.DDMReader.ensureBLayerDataInBuffer(Unknown Source)
> at org.apache.derby.impl.drda.DDMReader.readNetworkShort(Unknown
> Source)
> at org.apache.derby.impl.drda.DDMReader.readLDStringData(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.readAndSetParams(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseSQLDTA_work(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseSQLDTA(Unknown
> Source)
> at
> org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTTobjects(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
> agentThread[DRDAConnThread_11,5,main]
> null
> java.lang.ArrayIndexOutOfBoundsException
> at java.lang.System.arraycopy(Native Method)
> at org.apache.derby.impl.drda.DDMReader.compressBLayerData(Unknown
> Source)
> at
> org.apache.derby.impl.drda.DDMReader.ensureBLayerDataInBuffer(Unknown Source)
> at org.apache.derby.impl.drda.DDMReader.readNetworkShort(Unknown
> Source)
> at org.apache.derby.impl.drda.DDMReader.readLDStringData(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.readAndSetParams(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseSQLDTA_work(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseSQLDTA(Unknown
> Source)
> at
> org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTTobjects(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown
> Source)
> at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira