Fix crash when discovering devices & platforms.
authorMandeep Shetty <mandeep.shetty@intel.com>
Thu, 24 Sep 2015 21:52:23 +0000 (14:52 -0700)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Mon, 28 Sep 2015 16:45:20 +0000 (16:45 +0000)
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 <mandeep.shetty@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/3059
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
(cherry picked from commit bf098fcea98bcc7a8ccd490a512f8aee320bcce7)
Reviewed-on: https://gerrit.iotivity.org/gerrit/3127

resource/csdk/stack/src/ocpayloadconvert.c
resource/csdk/stack/src/ocpayloadparse.c

index ae2aaef..97d0d58 100644 (file)
@@ -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);
 
index 60472ba..1f618f1 100644 (file)
@@ -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);