From c7f62aa235d0157ad562de2eeab97ed2043dc766 Mon Sep 17 00:00:00 2001 From: MatthewCoppola4 Date: Wed, 10 Aug 2016 11:07:48 -0700 Subject: [PATCH] Mpl Static Global was uninitialzed. (#359) This resulted in a crash when pinging the mesh local address. --- src/core/net/ip6.cpp | 14 +++++++++++--- src/core/net/ip6.hpp | 5 +++++ src/core/openthread.cpp | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index f36bc6d3b..e6239bae8 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,9 @@ namespace Thread { namespace Ip6 { -static Mpl sMpl; +static otDEFINE_ALIGNED_VAR(sMplBuf, sizeof(Mpl), uint64_t); +static Mpl *sMpl; + static otReceiveIp6DatagramCallback sReceiveIp6DatagramCallback = NULL; static ThreadError ForwardMessage(Message &message, MessageInfo &messageInfo); @@ -57,6 +60,11 @@ Message *Ip6::NewMessage(uint16_t reserved) sizeof(Header) + sizeof(HopByHopHeader) + sizeof(OptionMpl) + reserved); } +void Ip6::Init(void) +{ + sMpl = new(&sMplBuf) Mpl; +} + uint16_t Ip6::UpdateChecksum(uint16_t checksum, uint16_t val) { uint16_t result = checksum + val; @@ -105,7 +113,7 @@ ThreadError AddMplOption(Message &message, Header &header, IpProto nextHeader, u hbhHeader.SetNextHeader(nextHeader); hbhHeader.SetLength(0); - sMpl.InitOption(mplOption, HostSwap16(header.GetSource().mFields.m16[7])); + sMpl->InitOption(mplOption, HostSwap16(header.GetSource().mFields.m16[7])); SuccessOrExit(error = message.Prepend(&mplOption, sizeof(mplOption))); SuccessOrExit(error = message.Prepend(&hbhHeader, sizeof(hbhHeader))); header.SetPayloadLength(sizeof(hbhHeader) + sizeof(mplOption) + payloadLength); @@ -198,7 +206,7 @@ ThreadError HandleOptions(Message &message) switch (optionHeader.GetType()) { case OptionMpl::kType: - SuccessOrExit(error = sMpl.ProcessOption(message)); + SuccessOrExit(error = sMpl->ProcessOption(message)); break; default: diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index 27313ed74..d2102842e 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -490,6 +490,11 @@ public: */ static Message *NewMessage(uint16_t aReserved); + /** + * This static method for initialization. + */ + static void Init(void); + /** * This static method sends an IPv6 datagram. * diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 1af9b36d4..8fed7da1e 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -687,6 +688,7 @@ ThreadError otEnable(void) otLogInfoApi("otEnable\n"); Message::Init(); sThreadNetif = new(&sThreadNetifRaw) ThreadNetif; + Ip6::Ip6::Init(); mEnabled = true; exit: