From 1ef216586613a8e291a7a18131fe6c71d76e681c Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 1 Sep 2016 18:09:16 -0700 Subject: [PATCH] Mesh_forwarder: Copy the payload into message before ipv6 filter check (#511) This commit changes the steps in `mesh_forwarder` so we check the ipv6 filter (security) check after payload is copied into the message buffer. This helps the IPv6 filter to pass along the TCP packets with unsecure dst port(s) properly. --- src/core/thread/mesh_forwarder.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 5f90b3235..ce351401c 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -1302,9 +1302,6 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, datagramLength); VerifyOrExit(headerLength > 0, error = kThreadError_NoBufs); - // Security Check - VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); - aFrame += headerLength; aFrameLength -= headerLength; @@ -1314,6 +1311,13 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, message->SetDatagramTag(datagramTag); message->SetTimeout(kReassemblyTimeout); + // copy Fragment + message->Write(message->GetOffset(), aFrameLength, aFrame); + message->MoveOffset(aFrameLength); + + // Security Check + VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); + mReassemblyList.Enqueue(*message); if (!mReassemblyTimer.IsRunning()) @@ -1339,14 +1343,12 @@ void MeshForwarder::HandleFragment(uint8_t *aFrame, uint8_t aFrameLength, } VerifyOrExit(message != NULL, error = kThreadError_Drop); + + // copy Fragment + message->Write(message->GetOffset(), aFrameLength, aFrame); + message->MoveOffset(aFrameLength); } - assert(message != NULL); - - // copy Fragment - message->Write(message->GetOffset(), aFrameLength, aFrame); - message->MoveOffset(aFrameLength); - exit: if (error == kThreadError_None) @@ -1412,9 +1414,6 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength, headerLength = mLowpan.Decompress(*message, aMacSource, aMacDest, aFrame, aFrameLength, 0); VerifyOrExit(headerLength > 0, error = kThreadError_Drop); - // Security Check - VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); - aFrame += headerLength; aFrameLength -= headerLength; @@ -1425,6 +1424,9 @@ void MeshForwarder::HandleLowpanHC(uint8_t *aFrame, uint8_t aFrameLength, message->Write(message->GetOffset(), aFrameLength, aFrame); + // Security Check + VerifyOrExit(mNetif.GetIp6Filter().Accept(*message), error = kThreadError_Drop); + exit: if (error == kThreadError_None)