mirror of
https://github.com/espressif/openthread.git
synced 2026-08-31 14:29:54 +00:00
[routing-manager] fix DiscoveredPrefixTable::Entry leak (#7945)
This commit fixes an issue with the potential overwriting of `mNext` when existing entry in the list is updated (avoid calling `Clear()`). It also updates `test_routing_manager` to check such a situation and ensure that the fix is addressing the issue.
This commit is contained in:
@@ -1861,7 +1861,6 @@ exit:
|
||||
|
||||
void RoutingManager::DiscoveredPrefixTable::Entry::InitFrom(const Ip6::Nd::RouterAdvertMessage::Header &aRaHeader)
|
||||
{
|
||||
Clear();
|
||||
mType = kTypeRoute;
|
||||
mValidLifetime = aRaHeader.GetRouterLifetime();
|
||||
mShared.mRoutePreference = aRaHeader.GetDefaultRouterPreference();
|
||||
@@ -1870,7 +1869,6 @@ void RoutingManager::DiscoveredPrefixTable::Entry::InitFrom(const Ip6::Nd::Route
|
||||
|
||||
void RoutingManager::DiscoveredPrefixTable::Entry::InitFrom(const Ip6::Nd::PrefixInfoOption &aPio)
|
||||
{
|
||||
Clear();
|
||||
aPio.GetPrefix(mPrefix);
|
||||
mType = kTypeOnLink;
|
||||
mValidLifetime = aPio.GetValidLifetime();
|
||||
@@ -1880,7 +1878,6 @@ void RoutingManager::DiscoveredPrefixTable::Entry::InitFrom(const Ip6::Nd::Prefi
|
||||
|
||||
void RoutingManager::DiscoveredPrefixTable::Entry::InitFrom(const Ip6::Nd::RouteInfoOption &aRio)
|
||||
{
|
||||
Clear();
|
||||
aRio.GetPrefix(mPrefix);
|
||||
mType = kTypeRoute;
|
||||
mValidLifetime = aRio.GetRouteLifetime();
|
||||
|
||||
@@ -546,6 +546,50 @@ void TestRoutingManager(void)
|
||||
|
||||
VerifyOrQuit(counter == 3);
|
||||
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Send the same RA again from router A with the on-link (PIO) and route prefix (RIO).
|
||||
|
||||
{
|
||||
Ip6::Nd::RouterAdvertMessage raMsg(Ip6::Nd::RouterAdvertMessage::Header(), buffer);
|
||||
|
||||
SuccessOrQuit(raMsg.AppendPrefixInfoOption(onLinkPrefix, kValidLitime, kPreferredLifetime));
|
||||
SuccessOrQuit(raMsg.AppendRouteInfoOption(routePrefix, kValidLitime, NetworkData::kRoutePreferenceMedium));
|
||||
|
||||
SendRouterAdvert(routerAddressA, raMsg.GetAsPacket());
|
||||
|
||||
Log("Send RA from router A");
|
||||
LogRouterAdvert(raMsg.GetAsPacket());
|
||||
}
|
||||
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Check the discovered prefix table and ensure info from router A
|
||||
// remains unchanged.
|
||||
|
||||
counter = 0;
|
||||
|
||||
rm.InitPrefixTableIterator(iter);
|
||||
|
||||
while (rm.GetNextPrefixTableEntry(iter, entry) == kErrorNone)
|
||||
{
|
||||
counter++;
|
||||
VerifyOrQuit(AsCoreType(&entry.mRouterAddress) == routerAddressA);
|
||||
|
||||
if (entry.mIsOnLink)
|
||||
{
|
||||
VerifyOrQuit(AsCoreType(&entry.mPrefix) == onLinkPrefix);
|
||||
VerifyOrQuit(entry.mValidLifetime = kValidLitime);
|
||||
VerifyOrQuit(entry.mPreferredLifetime = kPreferredLifetime);
|
||||
}
|
||||
else
|
||||
{
|
||||
VerifyOrQuit(AsCoreType(&entry.mPrefix) == routePrefix);
|
||||
VerifyOrQuit(entry.mValidLifetime = kValidLitime);
|
||||
VerifyOrQuit(static_cast<int8_t>(entry.mRoutePreference) == NetworkData::kRoutePreferenceMedium);
|
||||
}
|
||||
}
|
||||
|
||||
VerifyOrQuit(counter == 2);
|
||||
|
||||
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// Send an RA from router B with same route prefix (RIO) but with
|
||||
// high route preference.
|
||||
|
||||
Reference in New Issue
Block a user