From fd6ab37e8e2b1da6017177760cb786f4bf3989a3 Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Thu, 10 Sep 2015 14:51:32 -0700 Subject: [PATCH] Removed the OCPayloadType from the payload Previously, the CBOR container included the type of the message to make parsing of the CBOR items easier. This is unfortunately against the spec, so this patch removes it and requires the caller to ensure that the expected message type is sent. Incorrectly formatted messages will result in the message not passed back via the callback. Change-Id: If1ca9eed65b5274239b670e8a2bd6cadce763c19 Signed-off-by: Erich Keane Reviewed-on: https://gerrit.iotivity.org/gerrit/2482 Tested-by: jenkins-iotivity Reviewed-by: Patrick Lankswert --- .../csdk/stack/include/internal/ocpayloadcbor.h | 3 +- resource/csdk/stack/src/ocpayloadconvert.c | 18 ++----- resource/csdk/stack/src/ocpayloadparse.c | 9 ++-- resource/csdk/stack/src/ocserverrequest.c | 3 +- resource/csdk/stack/src/ocstack.c | 62 +++++++++++++++++++--- 5 files changed, 67 insertions(+), 28 deletions(-) diff --git a/resource/csdk/stack/include/internal/ocpayloadcbor.h b/resource/csdk/stack/include/internal/ocpayloadcbor.h index 5d3c16e..3e39742 100644 --- a/resource/csdk/stack/include/internal/ocpayloadcbor.h +++ b/resource/csdk/stack/include/internal/ocpayloadcbor.h @@ -23,7 +23,8 @@ #include "octypes.h" -OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize); +OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType type, + const uint8_t* payload, size_t payloadSize); OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* size); #endif diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index 5584a0b..603a7f6 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -176,9 +176,7 @@ static int64_t OCConvertSecurityPayload(OCSecurityPayload* payload, uint8_t* out cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 2); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_SECURITY); - + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); CborEncoder map; err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); @@ -207,8 +205,7 @@ static int64_t OCConvertDiscoveryPayload(OCDiscoveryPayload* payload, uint8_t* o cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 1 + resourceCount); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_DISCOVERY); + err = err | cbor_encoder_create_array(&encoder, &rootArray, resourceCount); for(size_t i = 0; i < resourceCount; ++i) { @@ -320,8 +317,7 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 2); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_DEVICE); + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); { CborEncoder map; @@ -379,8 +375,7 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* out cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 2); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_PLATFORM); + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); { CborEncoder map; err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); @@ -678,7 +673,6 @@ static int64_t OCConvertRepPayload(OCRepPayload* payload, uint8_t* outPayload, s cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; err = err | cbor_encoder_create_array(&encoder, &rootArray, CborIndefiniteLength); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_REPRESENTATION); while(payload != NULL && (err == 0 || err == CborErrorOutOfMemory)) { @@ -701,9 +695,7 @@ static int64_t OCConvertPresencePayload(OCPresencePayload* payload, cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; - err = err | cbor_encoder_create_array(&encoder, &rootArray, 2); - err = err | cbor_encode_uint(&rootArray, PAYLOAD_TYPE_PRESENCE); - + err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); CborEncoder map; err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index d7ed58a..81dede5 100644 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -36,7 +36,8 @@ static OCStackResult OCParseRepPayload(OCPayload** outPayload, CborValue* arrayV static OCStackResult OCParsePresencePayload(OCPayload** outPayload, CborValue* arrayVal); static OCStackResult OCParseSecurityPayload(OCPayload** outPayload, CborValue* arrayVal); -OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, size_t payloadSize) +OCStackResult OCParsePayload(OCPayload** outPayload, OCPayloadType payloadType, + const uint8_t* payload, size_t payloadSize) { CborParser parser; CborValue rootValue; @@ -59,11 +60,7 @@ OCStackResult OCParsePayload(OCPayload** outPayload, const uint8_t* payload, siz // enter the array err = err || cbor_value_enter_container(&rootValue, &arrayValue); - int payloadType = 0; - err = err || cbor_value_get_int(&arrayValue, &payloadType); - err = err || cbor_value_advance_fixed(&arrayValue); - - if(err) + if(err || arrayValue.type != CborMapType) { OC_LOG_V(ERROR, TAG, "CBOR payload parse failed :%d", err); return OC_STACK_MALFORMED_RESPONSE; diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index d8e9877..4122a33 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -347,7 +347,8 @@ OCStackResult FormOCEntityHandlerRequest( if(payload && payloadSize) { - if(OCParsePayload(&entityHandlerRequest->payload, payload, payloadSize) != OC_STACK_OK) + if(OCParsePayload(&entityHandlerRequest->payload, PAYLOAD_TYPE_REPRESENTATION, + payload, payloadSize) != OC_STACK_OK) { return OC_STACK_ERROR; } diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 6e04736..3e1d404 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -875,7 +875,9 @@ OCStackResult HandlePresenceResponse(const CAEndpoint_t *endpoint, if (responseInfo->info.payload) { - result = OCParsePayload(&response.payload, responseInfo->info.payload, + result = OCParsePayload(&response.payload, + PAYLOAD_TYPE_PRESENCE, + responseInfo->info.payload, responseInfo->info.payloadSize); if(result != OC_STACK_OK) @@ -1088,14 +1090,60 @@ void HandleCAResponses(const CAEndpoint_t* endPoint, const CAResponseInfo_t* res response.identity.id_length = responseInfo->info.identity.id_length; response.result = CAToOCStackResult(responseInfo->result); + if(responseInfo->info.payload && - responseInfo->info.payloadSize && - OC_STACK_OK != OCParsePayload(&response.payload, responseInfo->info.payload, - responseInfo->info.payloadSize)) + responseInfo->info.payloadSize) { - OC_LOG(ERROR, TAG, "Error converting payload"); - OCPayloadDestroy(response.payload); - return; + OCPayloadType type = PAYLOAD_TYPE_INVALID; + if (cbNode->method == OC_REST_DISCOVER) + { + if (strncmp(OC_RSRVD_WELL_KNOWN_URI,cbNode->requestUri, + sizeof(OC_RSRVD_WELL_KNOWN_URI) - 1) == 0) + { + type = PAYLOAD_TYPE_DISCOVERY; + } + else if (strcmp(cbNode->requestUri, OC_RSRVD_DEVICE_URI) == 0) + { + type = PAYLOAD_TYPE_DEVICE; + } + else if (strcmp(cbNode->requestUri, OC_RSRVD_PLATFORM_URI) == 0) + { + type = PAYLOAD_TYPE_PLATFORM; + } + else + { + OC_LOG_V(ERROR, TAG, "Unknown Payload type in Discovery: %d %s", + cbNode->method, cbNode->requestUri); + return; + } + } + else if (cbNode->method == OC_REST_GET || + cbNode->method == OC_REST_PUT || + cbNode->method == OC_REST_POST || + cbNode->method == OC_REST_OBSERVE || + cbNode->method == OC_REST_OBSERVE_ALL || + cbNode->method == OC_REST_DELETE) + { + OC_LOG_V(INFO, TAG, "Assuming PAYLOAD_TYPE_REPRESENTATION: %d %s", + cbNode->method, cbNode->requestUri); + type = PAYLOAD_TYPE_REPRESENTATION; + } + else + { + OC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s", + cbNode->method, cbNode->requestUri); + return; + } + + if(OC_STACK_OK != OCParsePayload(&response.payload, + type, + responseInfo->info.payload, + responseInfo->info.payloadSize)) + { + OC_LOG(ERROR, TAG, "Error converting payload"); + OCPayloadDestroy(response.payload); + return; + } } response.numRcvdVendorSpecificHeaderOptions = 0; -- 2.7.4