diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index c80053799..80b7228d5 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -314,7 +314,7 @@ ThreadError Dataset::ProcessCommit(otInstance *aInstance, int argc, char *argv[] { ThreadError error = kThreadError_None; - VerifyOrExit(argc > 0); + VerifyOrExit(argc > 0, error = kThreadError_InvalidArgs); if (strcmp(argv[0], "active") == 0) { diff --git a/src/core/net/icmp6.cpp b/src/core/net/icmp6.cpp index f4014bf32..05b126318 100644 --- a/src/core/net/icmp6.cpp +++ b/src/core/net/icmp6.cpp @@ -156,14 +156,15 @@ ThreadError Icmp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo) IcmpHeader icmp6Header; uint16_t checksum; - VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(icmp6Header), &icmp6Header) == sizeof(icmp6Header)); + VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(icmp6Header), &icmp6Header) == sizeof(icmp6Header), + error = kThreadError_Parse); payloadLength = aMessage.GetLength() - aMessage.GetOffset(); // verify checksum checksum = Ip6::ComputePseudoheaderChecksum(aMessageInfo.GetPeerAddr(), aMessageInfo.GetSockAddr(), payloadLength, kProtoIcmp6); checksum = aMessage.UpdateChecksum(checksum, aMessage.GetOffset(), payloadLength); - VerifyOrExit(checksum == 0xffff); + VerifyOrExit(checksum == 0xffff, error = kThreadError_Parse); if (mIsEchoEnabled && (icmp6Header.GetType() == kIcmp6TypeEchoRequest)) { diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 5b66ee69b..16a610ece 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -251,7 +251,7 @@ ThreadError Ip6::RemoveMplOption(Message &aMessage) aMessage.Read(offset, sizeof(hbh), &hbh); endOffset = offset + (hbh.GetLength() + 1) * 8; - VerifyOrExit(aMessage.GetLength() >= endOffset); + VerifyOrExit(aMessage.GetLength() >= endOffset, error = kThreadError_Parse); offset += sizeof(hbh); @@ -298,7 +298,7 @@ ThreadError Ip6::RemoveMplOption(Message &aMessage) } // verify that IPv6 Options header is properly formed - VerifyOrExit(offset == endOffset); + VerifyOrExit(offset == endOffset, error = kThreadError_Parse); if (remove) { diff --git a/src/core/net/udp6.cpp b/src/core/net/udp6.cpp index df5dd736f..80386c263 100644 --- a/src/core/net/udp6.cpp +++ b/src/core/net/udp6.cpp @@ -220,9 +220,10 @@ ThreadError Udp::HandleMessage(Message &aMessage, MessageInfo &aMessageInfo) checksum = Ip6::ComputePseudoheaderChecksum(aMessageInfo.GetPeerAddr(), aMessageInfo.GetSockAddr(), payloadLength, kProtoUdp); checksum = aMessage.UpdateChecksum(checksum, aMessage.GetOffset(), payloadLength); - VerifyOrExit(checksum == 0xffff); + VerifyOrExit(checksum == 0xffff, error = kThreadError_Drop); - VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(udpHeader), &udpHeader) == sizeof(udpHeader)); + VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(udpHeader), &udpHeader) == sizeof(udpHeader), + error = kThreadError_Parse); aMessage.MoveOffset(sizeof(udpHeader)); aMessageInfo.mPeerPort = udpHeader.GetSourcePort(); aMessageInfo.mSockPort = udpHeader.GetDestinationPort(); diff --git a/src/core/thread/announce_begin_server.cpp b/src/core/thread/announce_begin_server.cpp index 329b2e880..e0a7e6b46 100644 --- a/src/core/thread/announce_begin_server.cpp +++ b/src/core/thread/announce_begin_server.cpp @@ -89,7 +89,7 @@ ThreadError AnnounceBeginServer::SendAnnounce(uint32_t aChannelMask, uint8_t aCo while ((mChannelMask & (1 << mChannel)) == 0) { mChannel++; - VerifyOrExit(mChannel <= kPhyMaxChannel); + VerifyOrExit(mChannel <= kPhyMaxChannel, error = kThreadError_InvalidArgs); } mTimer.Start(mPeriod); diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index d53b5390f..4494a99ba 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -412,7 +412,7 @@ ThreadError Mle::Discover(uint32_t aScanChannels, uint16_t aPanId, bool aJoiner, mDiscoverContext = aContext; mNetif.GetMeshForwarder().SetDiscoverParameters(aScanChannels); - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeMleDiscoverRequest); message->SetPanId(aPanId); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDiscoveryRequest)); @@ -1510,7 +1510,7 @@ ThreadError Mle::SendParentRequest(void) break; } - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentRequest)); SuccessOrExit(error = AppendMode(*message, mDeviceMode)); SuccessOrExit(error = AppendChallenge(*message, mParentRequest.mChallenge, sizeof(mParentRequest.mChallenge))); @@ -1557,7 +1557,7 @@ ThreadError Mle::SendChildIdRequest(void) Message *message; Ip6::Address destination; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdRequest)); SuccessOrExit(error = AppendResponse(*message, mChildIdRequest.mChallenge, mChildIdRequest.mChallengeLength)); SuccessOrExit(error = AppendLinkFrameCounter(*message)); @@ -1603,7 +1603,7 @@ ThreadError Mle::SendDataRequest(const Ip6::Address &aDestination, const uint8_t ThreadError error = kThreadError_None; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataRequest)); SuccessOrExit(error = AppendTlvRequest(*message, aTlvs, aTlvsLength)); SuccessOrExit(error = AppendActiveTimestamp(*message, false)); @@ -1670,7 +1670,7 @@ ThreadError Mle::SendChildUpdateRequest(void) mParentRequestTimer.Start(kUnicastRetransmissionDelay); mChildUpdateAttempts++; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeMleChildUpdateRequest); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest)); SuccessOrExit(error = AppendMode(*message, mDeviceMode)); @@ -1738,7 +1738,7 @@ ThreadError Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -1799,7 +1799,7 @@ ThreadError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); message->SetLinkSecurityEnabled(true); message->SetSubType(Message::kSubTypeMleAnnounce); message->SetChannel(aChannel); @@ -3002,14 +3002,14 @@ ThreadError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo otLogInfoMle(GetInstance(), "Received announce"); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kChannel, sizeof(channel), channel)); - VerifyOrExit(channel.IsValid()); + SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kChannel, sizeof(channel), channel)); + VerifyOrExit(channel.IsValid(), error = kThreadError_Parse); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(timestamp), timestamp)); - VerifyOrExit(timestamp.IsValid()); + SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kActiveTimestamp, sizeof(timestamp), timestamp)); + VerifyOrExit(timestamp.IsValid(), error = kThreadError_Parse); - SuccessOrExit(Tlv::GetTlv(aMessage, Tlv::kPanId, sizeof(panid), panid)); - VerifyOrExit(panid.IsValid()); + SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kPanId, sizeof(panid), panid)); + VerifyOrExit(panid.IsValid(), error = kThreadError_Parse); localTimestamp = mNetif.GetActiveDataset().GetNetwork().GetTimestamp(); diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 06971dae4..444bcb480 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -352,6 +352,7 @@ ThreadError MleRouter::HandleDetachStart(void) ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter) { + ThreadError error = kThreadError_None; mRouterIdSequenceLastUpdated = Timer::GetNow(); mRouterSelectionJitterTimeout = (otPlatRandomGet() % mRouterSelectionJitter) + 1; @@ -365,7 +366,7 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter) mNetif.SubscribeAllRoutersMulticast(); - VerifyOrExit(IsRouterIdValid(mPreviousRouterId)); + VerifyOrExit(IsRouterIdValid(mPreviousRouterId), error = kThreadError_InvalidState); switch (aFilter) { @@ -412,7 +413,7 @@ exit: SetRouterId(kInvalidRouterId); } - return kThreadError_None; + return error; } ThreadError MleRouter::SetStateRouter(uint16_t aRloc16) @@ -539,7 +540,7 @@ ThreadError MleRouter::SendAdvertisement(void) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandAdvertisement)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -587,7 +588,7 @@ ThreadError MleRouter::SendLinkRequest(Neighbor *aNeighbor) memset(&destination, 0, sizeof(destination)); - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandLinkRequest)); SuccessOrExit(error = AppendVersion(*message)); @@ -666,9 +667,9 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes otLogInfoMle(GetInstance(), "Received link request"); VerifyOrExit(GetDeviceState() == kDeviceStateRouter || - GetDeviceState() == kDeviceStateLeader); + GetDeviceState() == kDeviceStateLeader, error = kThreadError_InvalidState); - VerifyOrExit(mParentRequestState == kParentIdle); + VerifyOrExit(mParentRequestState == kParentIdle, error = kThreadError_InvalidState); macAddr.Set(aMessageInfo.GetPeerAddr()); @@ -684,7 +685,7 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes if (Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData) == kThreadError_None) { VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse); - VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId()); + VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId(), error = kThreadError_InvalidState); } // Source Address @@ -767,7 +768,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig command = (aNeighbor == NULL || aNeighbor->GetState() == Neighbor::kStateValid) ? Header::kCommandLinkAccept : Header::kCommandLinkAcceptAndRequest; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, command)); SuccessOrExit(error = AppendVersion(*message)); SuccessOrExit(error = AppendSourceAddress(*message)); @@ -1909,7 +1910,7 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha Message *message; uint16_t delay; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandParentResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -2049,12 +2050,13 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6:: // Find Child macAddr.Set(aMessageInfo.GetPeerAddr()); - VerifyOrExit((child = FindChild(macAddr)) != NULL); + VerifyOrExit((child = FindChild(macAddr)) != NULL, error = kThreadError_Already); // Response SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response)); VerifyOrExit(response.IsValid() && - memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0); + memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0, + error = kThreadError_Security); // Link-Layer Frame Counter SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkFrameCounter, sizeof(linkFrameCounter), @@ -2337,7 +2339,8 @@ ThreadError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const if (Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response) == kThreadError_None) { VerifyOrExit(response.IsValid() && - memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0); + memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0, + error = kThreadError_Security); } // Link-Layer Frame Counter @@ -2541,7 +2544,7 @@ ThreadError MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6 otLogInfoMle(GetInstance(), "Received discovery request"); // only Routers and REEDs respond - VerifyOrExit((mDeviceMode & ModeTlv::kModeFFD) != 0); + VerifyOrExit((mDeviceMode & ModeTlv::kModeFFD) != 0, error = kThreadError_InvalidState); offset = aMessage.GetOffset(); end = aMessage.GetLength(); @@ -2585,7 +2588,7 @@ ThreadError MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6 else // if steering data is not set out of band, fall back to network data #endif // OPENTHREAD_CONFIG_ENABLE_STEERING_DATA_SET_OOB { - VerifyOrExit(mNetif.GetNetworkDataLeader().IsJoiningEnabled()); + VerifyOrExit(mNetif.GetNetworkDataLeader().IsJoiningEnabled(), error = kThreadError_NotCapable); } } @@ -2630,7 +2633,7 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u MeshCoP::Tlv *steeringData; uint16_t delay; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeMleDiscoverResponse); message->SetPanId(aPanId); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDiscoveryResponse)); @@ -2672,7 +2675,7 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u // Otherwise use the one from commissioning data. if (!mSteeringData.IsCleared()) { - SuccessOrExit(message->Append(&mSteeringData, sizeof(mSteeringData) + mSteeringData.GetLength())); + SuccessOrExit(error = message->Append(&mSteeringData, sizeof(mSteeringData) + mSteeringData.GetLength())); } else #endif // OPENTHREAD_CONFIG_ENABLE_STEERING_DATA_SET_OOB @@ -2682,7 +2685,7 @@ ThreadError MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, u if (steeringData != NULL) { - SuccessOrExit(message->Append(steeringData, sizeof(*steeringData) + steeringData->GetLength())); + SuccessOrExit(error = message->Append(steeringData, sizeof(*steeringData) + steeringData->GetLength())); } } @@ -2716,7 +2719,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild) Ip6::Address destination; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildIdResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -2794,7 +2797,7 @@ exit: message->Free(); } - return kThreadError_None; + return error; } ThreadError MleRouter::SendChildUpdateRequest(Child *aChild) @@ -2818,7 +2821,7 @@ ThreadError MleRouter::SendChildUpdateRequest(Child *aChild) } } - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); message->SetSubType(Message::kSubTypeMleChildUpdateRequest); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest)); SuccessOrExit(error = AppendSourceAddress(*message)); @@ -2856,7 +2859,7 @@ ThreadError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::Message ThreadError error = kThreadError_None; Message *message; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateResponse)); for (int i = 0; i < aTlvslength; i++) @@ -2929,7 +2932,7 @@ ThreadError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const Neighbor *neighbor; bool stableOnly; - VerifyOrExit((message = NewMleMessage()) != NULL); + VerifyOrExit((message = NewMleMessage()) != NULL, error = kThreadError_NoBufs); SuccessOrExit(error = AppendHeader(*message, Header::kCommandDataResponse)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); @@ -3464,8 +3467,8 @@ ThreadError MleRouter::RestoreChildren(void) uint16_t length; length = sizeof(childInfo); - SuccessOrExit(otPlatSettingsGet(mNetif.GetInstance(), kKeyChildInfo, i, - reinterpret_cast(&childInfo), &length)); + SuccessOrExit(error = otPlatSettingsGet(mNetif.GetInstance(), kKeyChildInfo, i, + reinterpret_cast(&childInfo), &length)); VerifyOrExit(length >= sizeof(childInfo), error = kThreadError_Parse); VerifyOrExit((child = NewChild()) != NULL, error = kThreadError_NoBufs); @@ -3493,9 +3496,9 @@ ThreadError MleRouter::RemoveStoredChild(uint16_t aChildRloc16) ChildInfo childInfo; uint16_t length = sizeof(childInfo); - SuccessOrExit(otPlatSettingsGet(mNetif.GetInstance(), kKeyChildInfo, i, - reinterpret_cast(&childInfo), &length)); - VerifyOrExit(length == sizeof(childInfo)); + SuccessOrExit(error = otPlatSettingsGet(mNetif.GetInstance(), kKeyChildInfo, i, + reinterpret_cast(&childInfo), &length)); + VerifyOrExit(length == sizeof(childInfo), error = kThreadError_Parse); if (childInfo.mRloc16 == aChildRloc16) { diff --git a/src/core/thread/src_match_controller.cpp b/src/core/thread/src_match_controller.cpp index 0f19ee5c8..d6754a40e 100644 --- a/src/core/thread/src_match_controller.cpp +++ b/src/core/thread/src_match_controller.cpp @@ -237,7 +237,7 @@ ThreadError SourceMatchController::AddPendingEntries(void) { if (child->IsStateValidOrRestoring() && child->IsIndirectSourceMatchPending()) { - SuccessOrExit(AddAddress(*child)); + SuccessOrExit(error = AddAddress(*child)); child->SetIndirectSourceMatchPending(false); } }