Igor Sapego created IGNITE-23598:
------------------------------------
Summary: CPP: Network module LengthPrefixCodec has a bug
Key: IGNITE-23598
URL: https://issues.apache.org/jira/browse/IGNITE-23598
Project: Ignite
Issue Type: Bug
Components: odbc, platforms, thin client
Affects Versions: 2.16
Reporter: Igor Sapego
The bug was originally reported at GitHub by https://github.com/morphad
(https://github.com/apache/ignite/issues/11524).
Apparently, there is a bug in LengthPrefixCodec::Decode function, in file
modules/platforms/cpp/network/src/network/length_prefix_codec.cpp
# A call of LengthPrefixCodec::Decode with data length of 3, the packetSize
reset to -1, and the packet length will be 3;
# The following call, will enter first if, and the packet length of 3 reset to
0, the packet last 3 byte data will be lost.
{code:cpp}
DataBuffer LengthPrefixCodec::Decode(DataBuffer& data)
{
if (packet.IsValid() && packet.Get()->Length() == (PACKET_HEADER_SIZE +
packetSize))
{
packetSize = -1;
packet.Get()->Length(0);
}
if (packetSize < 0)
{
Consume(data, PACKET_HEADER_SIZE);
if (packet.Get()->Length() < PACKET_HEADER_SIZE)
return DataBuffer();
packetSize = impl::binary::BinaryUtils::ReadInt32(*packet.Get(), 0);
}
Consume(data, PACKET_HEADER_SIZE + packetSize);
if (packet.Get()->Length() == (PACKET_HEADER_SIZE + packetSize))
return DataBuffer(packet, 0, PACKET_HEADER_SIZE + packetSize);
return DataBuffer();
}
{code}
Can be fixed like this:
{code:cpp}
DataBuffer LengthPrefixCodec::Decode(DataBuffer& data)
{
if (packet.IsValid() && packetSize != -1 && packet.Get()->Length() ==
(PACKET_HEADER_SIZE + packetSize))
{
packetSize = -1;
packet.Get()->Length(0);
}
...
}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)