[network-data] avoid overflow in Service TLV length computation (#3506)

This commit is contained in:
Jonathan Hui
2019-01-24 09:06:36 -08:00
committed by GitHub
parent ce3c712fe6
commit b431bc34ce
+3 -3
View File
@@ -177,7 +177,7 @@ otError Local::AddService(uint32_t aEnterpriseNumber,
otError error = OT_ERROR_NONE;
ServiceTlv *serviceTlv;
ServerTlv * serverTlv;
uint8_t serviceTlvLength =
size_t serviceTlvLength =
(sizeof(ServiceTlv) - sizeof(NetworkDataTlv)) + aServiceDataLength + sizeof(uint8_t) /*mServiceDataLength*/ +
ServiceTlv::GetEnterpriseNumberFieldLength(aEnterpriseNumber) + aServerDataLength + sizeof(ServerTlv);
@@ -186,13 +186,13 @@ otError Local::AddService(uint32_t aEnterpriseNumber,
VerifyOrExit(mLength + sizeof(NetworkDataTlv) + serviceTlvLength <= sizeof(mTlvs), error = OT_ERROR_NO_BUFS);
serviceTlv = reinterpret_cast<ServiceTlv *>(mTlvs + mLength);
Insert(reinterpret_cast<uint8_t *>(serviceTlv), serviceTlvLength + sizeof(NetworkDataTlv));
Insert(reinterpret_cast<uint8_t *>(serviceTlv), static_cast<uint8_t>(serviceTlvLength) + sizeof(NetworkDataTlv));
serviceTlv->Init();
serviceTlv->SetEnterpriseNumber(aEnterpriseNumber);
serviceTlv->SetServiceID(0);
serviceTlv->SetServiceData(aServiceData, aServiceDataLength);
serviceTlv->SetLength(serviceTlvLength);
serviceTlv->SetLength(static_cast<uint8_t>(serviceTlvLength));
serverTlv = reinterpret_cast<ServerTlv *>(serviceTlv->GetSubTlvs());
serverTlv->Init();