From 739006be37a1d7b29010f9dd485cf2d4cd05813d Mon Sep 17 00:00:00 2001 From: Buke Po Date: Tue, 25 Apr 2017 00:12:16 +0800 Subject: [PATCH] No payload no marker (#1645) * no payload no marker * raise coap error with marker but no payload --- src/cli/cli_coap.cpp | 16 +++++++++++++--- src/core/coap/coap_header.cpp | 4 ++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/cli/cli_coap.cpp b/src/cli/cli_coap.cpp index 1b0ca925c..5ef456c6a 100644 --- a/src/cli/cli_coap.cpp +++ b/src/cli/cli_coap.cpp @@ -266,6 +266,7 @@ ThreadError Coap::ProcessClient(int argc, char *argv[]) otMessage *message = NULL; otMessageInfo messageInfo; otCoapHeader header; + uint16_t payloadLength = 0; // Default parameters char coapUri[kMaxUriLength] = "test"; @@ -330,15 +331,24 @@ ThreadError Coap::ProcessClient(int argc, char *argv[]) otCoapHeaderInit(&header, coapType, coapCode); otCoapHeaderGenerateToken(&header, Thread::Coap::Header::kDefaultTokenLength); SuccessOrExit(error = otCoapHeaderAppendUriPathOptions(&header, coapUri)); - otCoapHeaderSetPayloadMarker(&header); + + if (argc > 4) + { + payloadLength = static_cast(strlen(argv[4])); + + if (payloadLength > 0) + { + otCoapHeaderSetPayloadMarker(&header); + } + } message = otCoapNewMessage(sInstance, &header); VerifyOrExit(message != NULL, error = kThreadError_NoBufs); // Embed content into message if given - if (argc > 4) + if (payloadLength > 0) { - SuccessOrExit(error = otMessageAppend(message, argv[4], static_cast(strlen(argv[4])))); + SuccessOrExit(error = otMessageAppend(message, argv[4], payloadLength)); } memset(&messageInfo, 0, sizeof(messageInfo)); diff --git a/src/core/coap/coap_header.cpp b/src/core/coap/coap_header.cpp index a2628cb1c..ca06a03c2 100644 --- a/src/core/coap/coap_header.cpp +++ b/src/core/coap/coap_header.cpp @@ -96,6 +96,10 @@ ThreadError Header::FromMessage(const Message &aMessage, uint16_t aMetadataSize) if (mHeader.mBytes[mHeaderLength] == 0xff) { mHeaderLength += sizeof(uint8_t); + length -= sizeof(uint8_t); + // RFC7252: The presence of a marker followed by a zero-length payload MUST be processed + // as a message format error. + VerifyOrExit(length > 0, error = kThreadError_Parse); ExitNow(error = kThreadError_None); }