From: Mandeep Shetty Date: Thu, 24 Sep 2015 21:52:23 +0000 (-0700) Subject: Fix crash when discovering devices & platforms. X-Git-Tag: 1.2.0+RC1~1023 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bf098fcea98bcc7a8ccd490a512f8aee320bcce7;p=platform%2Fupstream%2Fiotivity.git Fix crash when discovering devices & platforms. This fixes IOT-714 Iotivity does not currently enforce the mandatory fields of device and platform be set by applications. As a result, servers that do NOT set device and platform info segfault when encoding device and platform info into CBOR as CBOR expects the fields to be present. Modified cbor payload to work with NULL fields in device and platform payloads. This changed also needs to go into 1.0.0-dev. Change-Id: Ia626422bd441069febd47a5f44dd12aa42b1d46e Signed-off-by: Mandeep Shetty Reviewed-on: https://gerrit.iotivity.org/gerrit/3059 Tested-by: jenkins-iotivity Reviewed-by: Patrick Lankswert --- diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index ae2aaef..97d0d58 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -348,10 +348,10 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl { CborEncoder map; - err = err | cbor_encoder_create_map(&rootArray, &map, 2); + err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); // uri - err = err | AddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, + err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, payload->uri); // Rep Map @@ -359,7 +359,7 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl CborEncoder repMap; err = err | cbor_encode_text_string(&map, OC_RSRVD_REPRESENTATION, sizeof(OC_RSRVD_REPRESENTATION) - 1); - err = err | cbor_encoder_create_map(&map, &repMap, 4); + err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); // Device ID err = err | cbor_encode_text_string(&repMap, OC_RSRVD_DEVICE_ID, @@ -367,17 +367,17 @@ static int64_t OCConvertDevicePayload(OCDevicePayload* payload, uint8_t* outPayl err = err | cbor_encode_byte_string(&repMap, payload->sid, UUID_SIZE); // Device Name - err = err | AddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DEVICE_NAME, sizeof(OC_RSRVD_DEVICE_NAME) - 1, payload->deviceName); // Device Spec Version - err = err | AddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_SPEC_VERSION, sizeof(OC_RSRVD_SPEC_VERSION) - 1, payload->specVersion); // Device data Model Version - err = err | AddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_DATA_MODEL_VERSION, sizeof(OC_RSRVD_DATA_MODEL_VERSION) - 1, payload->dataModelVersion); @@ -408,7 +408,7 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* out err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); // uri - err = err | AddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, + err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_HREF, sizeof(OC_RSRVD_HREF) - 1, payload->uri); // Rep Map @@ -419,12 +419,12 @@ static int64_t OCConvertPlatformPayload(OCPlatformPayload* payload, uint8_t* out err = err | cbor_encoder_create_map(&map, &repMap, CborIndefiniteLength); // Platform ID - err = err | AddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_PLATFORM_ID, sizeof(OC_RSRVD_PLATFORM_ID) - 1, payload->info.platformID); // MFG Name - err = err | AddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, + err = err | ConditionalAddTextStringToMap(&repMap, OC_RSRVD_MFG_NAME, sizeof(OC_RSRVD_MFG_NAME) - 1, payload->info.manufacturerName); diff --git a/resource/csdk/stack/src/ocpayloadparse.c b/resource/csdk/stack/src/ocpayloadparse.c index 60472ba..1f618f1 100644 --- a/resource/csdk/stack/src/ocpayloadparse.c +++ b/resource/csdk/stack/src/ocpayloadparse.c @@ -377,18 +377,30 @@ static OCStackResult OCParseDevicePayload(OCPayload** outPayload, CborValue* arr CborValue repVal; // Device ID - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_ID, &repVal); - err = err || cbor_value_dup_byte_string(&repVal, &sid, &len, NULL); + err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_ID, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_byte_string(&repVal, &sid, &len, NULL); + } // Device Name - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_NAME, &repVal); - err = err || cbor_value_dup_text_string(&repVal, &dname, &len, NULL); + err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DEVICE_NAME, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &dname, &len, NULL); + } // Device Spec Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SPEC_VERSION, &repVal); - err = err || cbor_value_dup_text_string(&repVal, &specVer, &len, NULL); - // Data Model Version - err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DATA_MODEL_VERSION, &repVal); - err = err || cbor_value_dup_text_string(&repVal, &dmVer, &len, NULL); + err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_SPEC_VERSION, &repVal); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &specVer, &len, NULL); + } + // Data Model Version + err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_DATA_MODEL_VERSION, &repVal); + if (cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &dmVer, &len, NULL); + } } err = err || cbor_value_advance(arrayVal); @@ -451,11 +463,17 @@ static OCStackResult OCParsePlatformPayload(OCPayload** outPayload, CborValue* a CborValue repVal; // Platform ID err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_PLATFORM_ID, &repVal); - err = err || cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.platformID), &len, NULL); + } // MFG Name err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_NAME, &repVal); - err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL); + if(cbor_value_is_valid(&repVal)) + { + err = err || cbor_value_dup_text_string(&repVal, &(info.manufacturerName), &len, NULL); + } // MFG URL err = err || cbor_value_map_find_value(&curVal, OC_RSRVD_MFG_URL, &repVal);