[hist-tracker] use Tlv::ParsedInfo for robust TLV parsing (#12229)

This commit updates `Server::PrepareAndSendAnswers()` to utilize
`Tlv::ParsedInfo` for more robust TLV parsing and validation. This
ensures correct validation and size calculation for both standard and
extended TLVs when iterating over TLVs through the received message.

This change also adds an explicit check to skip over extended TLVs,
ensuring the implementation correctly handles cases where extended
TLVs may be present.
This commit is contained in:
Abtin Keshavarzian
2025-12-19 12:16:44 -08:00
committed by GitHub
parent f8d74d8951
commit 7d23c9009a
+15 -11
View File
@@ -128,13 +128,13 @@ void Server::FreeAllRelatedAnswers(Coap::Message &aFirstAnswer)
void Server::PrepareAndSendAnswers(const Ip6::Address &aDestination, const Message &aRequest)
{
Coap::Message *answer;
Error error;
AnswerInfo info;
OffsetRange offsetRange;
Tlv tlv;
RequestTlv requestTlv;
AnswerTlv answerTlv;
Coap::Message *answer;
Error error;
AnswerInfo info;
OffsetRange offsetRange;
Tlv::ParsedInfo tlvInfo;
RequestTlv requestTlv;
AnswerTlv answerTlv;
if (Tlv::Find<QueryIdTlv>(aRequest, info.mQueryId) == kErrorNone)
{
@@ -147,12 +147,16 @@ void Server::PrepareAndSendAnswers(const Ip6::Address &aDestination, const Messa
offsetRange.InitFromMessageOffsetToEnd(aRequest);
for (; !offsetRange.IsEmpty(); offsetRange.AdvanceOffset(tlv.GetSize()))
for (; !offsetRange.IsEmpty(); offsetRange.AdvanceOffset(tlvInfo.GetSize()))
{
SuccessOrExit(error = aRequest.Read(offsetRange, tlv));
VerifyOrExit(offsetRange.Contains(tlv.GetSize()), error = kErrorParse);
SuccessOrExit(error = tlvInfo.ParseFrom(aRequest, offsetRange));
if (tlv.GetType() == Tlv::kRequest)
if (tlvInfo.mIsExtended)
{
continue;
}
if (tlvInfo.mType == Tlv::kRequest)
{
SuccessOrExit(error = aRequest.Read(offsetRange, requestTlv));
VerifyOrExit(requestTlv.IsValid(), error = kErrorParse);