[
https://issues.apache.org/jira/browse/QPID-6968?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Alex Rudyy updated QPID-6968:
-----------------------------
Attachment: 0001-QPID-6968-Fix-setting-of-position-in-org.apache.qpid.patch
Attached a simplest fix for the issue. However, it make sense to remove
redundant field
org.apache.qpid.bytebuffer.QpidByteBuffer.BufferDataInput#_offset as part of
the fix for the issue
> [Java Broker] Decoding of pipelined AMQP 0-9.x frames can fails when multiple
> frames are received as part of the same byte buffer
> ---------------------------------------------------------------------------------------------------------------------------------
>
> Key: QPID-6968
> URL: https://issues.apache.org/jira/browse/QPID-6968
> Project: Qpid
> Issue Type: Bug
> Components: Java Broker
> Affects Versions: qpid-java-6.0
> Reporter: Alex Rudyy
> Priority: Blocker
> Fix For: qpid-java-6.1
>
> Attachments:
> 0001-QPID-6968-Fix-setting-of-position-in-org.apache.qpid.patch
>
>
> Decoding of pipelined protocol initiation and frames for connection opening
> (ConnectionStartOk), etc might fails with AMQFrameDecodingException when
> protocol initiation and following frames (connection start ok, connection
> tune ok, etc) are received as part of the same byte buffer.
> The following exception is reported on frame decoding:
> {noformat}
> 016-01-04 18:31:37,152 ERROR [IO-/127.0.0.1:33680]
> o.a.q.s.p.v.AMQPConnection_0_8 Unexpected exception
> org.apache.qpid.framing.AMQFrameDecodingException: Unsupported frame type: 65
> at org.apache.qpid.codec.AMQDecoder.processFrame(AMQDecoder.java:215)
> ~[qpid-common-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.protocol.v0_8.BrokerDecoder.doProcessFrame(BrokerDecoder.java:118)
> ~[qpid-broker-plugins-amqp-0-8-protocol-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.protocol.v0_8.BrokerDecoder.processFrame(BrokerDecoder.java:65)
> ~[qpid-broker-plugins-amqp-0-8-protocol-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at org.apache.qpid.codec.AMQDecoder.processInput(AMQDecoder.java:185)
> ~[qpid-common-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at org.apache.qpid.codec.AMQDecoder.decode(AMQDecoder.java:125)
> ~[qpid-common-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.codec.ServerDecoder.decodeBuffer(ServerDecoder.java:43)
> ~[qpid-common-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.protocol.v0_8.AMQPConnection_0_8$1.run(AMQPConnection_0_8.java:266)
> [qpid-broker-plugins-amqp-0-8-protocol-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.protocol.v0_8.AMQPConnection_0_8$1.run(AMQPConnection_0_8.java:258)
> [qpid-broker-plugins-amqp-0-8-protocol-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at java.security.AccessController.doPrivileged(Native Method)
> [na:1.7.0_80]
> at
> org.apache.qpid.server.protocol.v0_8.AMQPConnection_0_8.received(AMQPConnection_0_8.java:257)
> [qpid-broker-plugins-amqp-0-8-protocol-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.MultiVersionProtocolEngine$SelfDelegateProtocolEngine.received(MultiVersionProtocolEngine.java:526)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.MultiVersionProtocolEngine.received(MultiVersionProtocolEngine.java:142)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.NonBlockingConnection.processAmqpData(NonBlockingConnection.java:547)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.NonBlockingConnectionPlainDelegate.processData(NonBlockingConnectionPlainDelegate.java:58)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.NonBlockingConnection.doRead(NonBlockingConnection.java:446)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.NonBlockingConnection.doWork(NonBlockingConnection.java:253)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.NetworkConnectionScheduler.processConnection(NetworkConnectionScheduler.java:108)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.SelectorThread$ConnectionProcessor.processConnection(SelectorThread.java:499)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.SelectorThread$SelectionTask.performSelect(SelectorThread.java:337)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.SelectorThread$SelectionTask.run(SelectorThread.java:86)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> org.apache.qpid.server.transport.SelectorThread.run(SelectorThread.java:457)
> [qpid-broker-core-6.1.0-SNAPSHOT.jar:6.1.0-SNAPSHOT]
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
> [na:1.7.0_80]
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
> [na:1.7.0_80]
> at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80]
> {noformat}
> After receiving protocol initiation QpidByteBuffer.BufferDataInput#_offset is
> set to 8. On decoding ConnectionStartOk, invocation of
> org.apache.qpid.codec.AMQDecoder#decodable sets the QpidByteBuffer position
> to 0 after parsing frame body size and resting of
> QpidByteBuffer.BufferDataInput.
> QpidByteBuffer.BufferDataInput#reset sets the position of byte buffer without
> accounting for QpidByteBuffer.BufferDataInput#_offset:
> {code}
> public void reset()
> {
> _buffer.position(_mark);
> }
> {code}
> IMHO, it should be
> {code}
> public void reset()
> {
> position(_mark);
> }
> {code}
> It looks like field QpidByteBuffer.BufferDataInput#_offset is redundant. At
> least, I do not see any obvious reasons to have this field. Thus, another way
> to fix the problem is deletion of QpidByteBuffer.BufferDataInput#_offset
> and invocation of methods of QpidByteBuffer to set/get the position from
> org.apache.qpid.bytebuffer.QpidByteBuffer.BufferDataInput#position()
> org.apache.qpid.bytebuffer.QpidByteBuffer.BufferDataInput#position(int)
> Additionally, methods QpidByteBuffer.BufferDataInput#position... could be
> in-lined.
> We might want to port the fix into 6.0.x branch
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]