From 2b11826fbe0304e9e92cc230e1c414f77a475f04 Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Fri, 20 Mar 2020 14:46:07 -0700 Subject: [PATCH] [lowpan] do not try to compress large extension headers (#4724) --- src/core/thread/lowpan.cpp | 14 ++++++++------ src/core/thread/lowpan.hpp | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/core/thread/lowpan.cpp b/src/core/thread/lowpan.cpp index 549f2460b..062d985bc 100644 --- a/src/core/thread/lowpan.cpp +++ b/src/core/thread/lowpan.cpp @@ -475,10 +475,8 @@ otError Lowpan::CompressExtensionHeader(Message &aMessage, BufferWriter &aBuf, u BufferWriter buf = aBuf; uint16_t startOffset = aMessage.GetOffset(); Ip6::ExtensionHeader extHeader; - Ip6::OptionHeader optionHeader; - uint8_t len; + uint16_t len; uint8_t padLength = 0; - uint16_t offset; uint8_t tmpByte; VerifyOrExit(aMessage.Read(aMessage.GetOffset(), sizeof(extHeader), &extHeader) == sizeof(extHeader), @@ -504,13 +502,17 @@ otError Lowpan::CompressExtensionHeader(Message &aMessage, BufferWriter &aBuf, u len = (extHeader.GetLength() + 1) * 8 - sizeof(extHeader); + // RFC 6282 does not support compressing large extension headers + VerifyOrExit(len <= kExtHdrMaxLength, error = OT_ERROR_FAILED); + // RFC 6282 says: "IPv6 Hop-by-Hop and Destination Options Headers may use a trailing // Pad1 or PadN to achieve 8-octet alignment. When there is a single trailing Pad1 or PadN // option of 7 octets or less and the containing header is a multiple of 8 octets, the trailing // Pad1 or PadN option MAY be elided by the compressor." if (aNextHeader == Ip6::kProtoHopOpts || aNextHeader == Ip6::kProtoDstOpts) { - offset = aMessage.GetOffset(); + uint16_t offset = aMessage.GetOffset(); + Ip6::OptionHeader optionHeader; while (offset < len + aMessage.GetOffset()) { @@ -544,8 +546,8 @@ otError Lowpan::CompressExtensionHeader(Message &aMessage, BufferWriter &aBuf, u aNextHeader = static_cast(extHeader.GetNextHeader()); - SuccessOrExit(error = buf.Write(len)); - SuccessOrExit(error = buf.Write(aMessage, len)); + SuccessOrExit(error = buf.Write(static_cast(len))); + SuccessOrExit(error = buf.Write(aMessage, static_cast(len))); aMessage.MoveOffset(len + padLength); exit: diff --git a/src/core/thread/lowpan.hpp b/src/core/thread/lowpan.hpp index 3ab78b9d3..01d972e8b 100644 --- a/src/core/thread/lowpan.hpp +++ b/src/core/thread/lowpan.hpp @@ -353,6 +353,7 @@ private: kExtHdrEidMask = 0x0e, kExtHdrNextHeader = 0x01, + kExtHdrMaxLength = 255, kUdpDispatch = 0xf0, kUdpDispatchMask = 0xf8,