mirror of
https://github.com/espressif/openthread.git
synced 2026-09-15 13:40:06 +00:00
[tlvs] fix overflow in TLV length calculation (#2108)
This commit is contained in:
@@ -68,22 +68,23 @@ otError Tlv::GetOffset(const Message &aMessage, uint8_t aType, uint16_t &aOffset
|
|||||||
|
|
||||||
while (offset + sizeof(tlv) <= end)
|
while (offset + sizeof(tlv) <= end)
|
||||||
{
|
{
|
||||||
uint16_t length;
|
uint32_t length = sizeof(tlv);
|
||||||
|
|
||||||
aMessage.Read(offset, sizeof(tlv), &tlv);
|
aMessage.Read(offset, sizeof(tlv), &tlv);
|
||||||
|
|
||||||
if (tlv.GetLength() != kExtendedLength)
|
if (tlv.GetLength() != kExtendedLength)
|
||||||
{
|
{
|
||||||
length = sizeof(tlv) + tlv.GetLength();
|
length += tlv.GetLength();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
VerifyOrExit(offset + sizeof(tlv) + sizeof(length) <= end);
|
uint16_t extLength;
|
||||||
aMessage.Read(offset + sizeof(tlv), sizeof(length), &length);
|
|
||||||
length = sizeof(tlv) + sizeof(length) + HostSwap16(length);
|
VerifyOrExit(sizeof(extLength) == aMessage.Read(offset + sizeof(tlv), sizeof(extLength), &extLength));
|
||||||
|
length += sizeof(extLength) + HostSwap16(extLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
VerifyOrExit(length <= end - offset);
|
VerifyOrExit(offset + length <= end);
|
||||||
|
|
||||||
if (tlv.GetType() == aType)
|
if (tlv.GetType() == aType)
|
||||||
{
|
{
|
||||||
@@ -91,7 +92,7 @@ otError Tlv::GetOffset(const Message &aMessage, uint8_t aType, uint16_t &aOffset
|
|||||||
ExitNow(error = OT_ERROR_NONE);
|
ExitNow(error = OT_ERROR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += length;
|
offset += static_cast<uint16_t>(length);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
|||||||
Reference in New Issue
Block a user