Ganesh Murthy created PROTON-1516:
-------------------------------------
Summary: [proton-c] Receiver crashes on receving a multiframe
delivery where the last frame is empty but with more=false
Key: PROTON-1516
URL: https://issues.apache.org/jira/browse/PROTON-1516
Project: Qpid Proton
Issue Type: Bug
Components: proton-c
Affects Versions: 0.17.0
Reporter: Ganesh Murthy
I am running a network with two Apache Qpid Dispatch routers. A sender is
attached to one of the routers and a receiver (simple_recv.py) is attached to
the other router. The sender is sending very large multi-frame deliveries.
The router, when it receives the message from the sender, keeps calling
pn_link_send() several times as and when it receives more data and then finally
calls pn_link_advance()
In very rare cases the following frame pattern is sent out from the router to
the receiver -
{noformat}
[0x7fc984034cc0]:2 -> @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"m\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=true] (16344)
"14150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345"...
(truncated)
[0x7fc984034cc0]:2 -> @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"m\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=true] (4692)
"13141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123"...
(truncated)
[0x7fc984034cc0]:2 -> @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"m\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=false]
{noformat}
Note that the last frame has no data in it but has more=false. I believe
proton-c on the router is creating this frame sequence, meaning that the router
code is not doing anything to create this frame sequence.
On the receiver side, when this frame sequence is received, the receiver
crashes as seen here -
{noformat}
[0x55da64b34470]:0 <- @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"r\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=true] (16349)
"21314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012"...
(truncated)
[0x55da64b34470]:0 <- @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"r\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=true] (17880)
"14150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345"...
(truncated)
[0x55da64b34470]:0 <- @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"r\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=true] (2964)
"67891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112131415012345678910111213141501234567891011121314150123456789101112"...
(truncated)
[0x55da64b34470]:0 <- @transfer(20) [handle=0, delivery-id=125,
delivery-tag=b"r\x01\x00\x00\x00\x00\x00\x00", message-format=0, settled=false,
more=false]
Traceback (most recent call last):
File "simple_recv.py", line 56, in <module>
Container(Recv(opts.address, opts.messages)).run()
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/reactor.py",
line 133, in run
while self.process(): pass
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/reactor.py",
line 159, in process
self._check_errors()
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/reactor.py",
line 155, in _check_errors
_compat.raise_(exc, value, tb)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 4050, in dispatch
ev.dispatch(self.handler)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 3962, in dispatch
self.dispatch(h, type)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 3959, in dispatch
result = dispatch(handler, type.method, self)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 3837, in dispatch
return m(*args)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/handlers.py",
line 159, in on_delivery
event.message = recv_msg(dlv)
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/handlers.py",
line 98, in recv_msg
msg.decode(delivery.link.recv(delivery.pending))
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 1111, in decode
self._check(pn_message_decode(self._msg, data))
File
"/opt/qpid-proton/qpid-proton/lib64/proton/bindings/python/proton/__init__.py",
line 822, in _check
raise exc("[%s]: %s" % (err, pn_error_text(pn_message_error(self._msg))))
proton.MessageException: [-4]: data error: not enough data to decode
{noformat}
The last frame being empty seems to be legal in AMQP 1.0.
Neither should this frame sequence be generated by proton nor should the
receiver crash when it sees this frame sequence.
So there seems to be two bugs here.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]