Security CBOR cleanup
[platform/upstream/iotivity.git] / resource / csdk / stack / src / ocpayload.c
old mode 100755 (executable)
new mode 100644 (file)
index d17dae1..7880b7c
@@ -32,7 +32,6 @@
 #define TAG "OIC_RI_PAYLOAD"
 
 static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val);
-static void FreeOCDiscoveryResource(OCResourcePayload* payload);
 
 void OCPayloadDestroy(OCPayload* payload)
 {
@@ -65,7 +64,7 @@ void OCPayloadDestroy(OCPayload* payload)
            OCRDPayloadDestroy((OCRDPayload*)payload);
            break;
         default:
-            OC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
+            OIC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type);
             OICFree(payload);
             break;
     }
@@ -132,34 +131,49 @@ static void OCCopyPropertyValueArray(OCRepPayloadValue* dest, OCRepPayloadValue*
     {
         case OCREP_PROP_INT:
             dest->arr.iArray = (int64_t*)OICMalloc(dimTotal * sizeof(int64_t));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.iArray, "Failed allocating memory");
             memcpy(dest->arr.iArray, source->arr.iArray, dimTotal * sizeof(int64_t));
             break;
         case OCREP_PROP_DOUBLE:
             dest->arr.dArray = (double*)OICMalloc(dimTotal * sizeof(double));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.dArray, "Failed allocating memory");
             memcpy(dest->arr.dArray, source->arr.dArray, dimTotal * sizeof(double));
             break;
         case OCREP_PROP_BOOL:
             dest->arr.bArray = (bool*)OICMalloc(dimTotal * sizeof(bool));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.bArray, "Failed allocating memory");
             memcpy(dest->arr.bArray, source->arr.bArray, dimTotal * sizeof(bool));
             break;
         case OCREP_PROP_STRING:
             dest->arr.strArray = (char**)OICMalloc(dimTotal * sizeof(char*));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.strArray, "Failed allocating memory");
             for(size_t i = 0; i < dimTotal; ++i)
             {
                 dest->arr.strArray[i] = OICStrdup(source->arr.strArray[i]);
             }
             break;
+        case OCREP_PROP_OBJECT:
+            dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
+            for(size_t i = 0; i < dimTotal; ++i)
+            {
+                dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
+            }
+            break;
         case OCREP_PROP_ARRAY:
             dest->arr.objArray = (OCRepPayload**)OICMalloc(dimTotal * sizeof(OCRepPayload*));
+            VERIFY_PARAM_NON_NULL(TAG, dest->arr.objArray, "Failed allocating memory");
             for(size_t i = 0; i < dimTotal; ++i)
             {
                 dest->arr.objArray[i] = OCRepPayloadClone(source->arr.objArray[i]);
             }
             break;
         default:
-            OC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
+            OIC_LOG(ERROR, TAG, "CopyPropertyValueArray invalid type");
             break;
     }
+exit:
+    return;
 }
 
 static void OCCopyPropertyValue (OCRepPayloadValue *dest, OCRepPayloadValue *source)
@@ -231,7 +245,7 @@ static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
                 }
                 OICFree(val->arr.ocByteStrArray);
                 break;
-            case OCREP_PROP_OBJECT:
+            case OCREP_PROP_OBJECT: // This case is the temporary fix for string input
                 for(size_t i = 0; i< dimTotal; ++i)
                 {
                     OCRepPayloadDestroy(val->arr.objArray[i]);
@@ -240,7 +254,7 @@ static void OCFreeRepPayloadValueContents(OCRepPayloadValue* val)
                 break;
             case OCREP_PROP_NULL:
             case OCREP_PROP_ARRAY:
-                OC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
+                OIC_LOG_V(ERROR, TAG, "FreeRepPayloadValueContents: Illegal type\
                         inside an array: %d", val->arr.type);
                 break;
         }
@@ -357,7 +371,7 @@ static OCRepPayloadValue* OCRepPayloadFindAndSetValue(OCRepPayload* payload, con
         val = val->next;
     }
 
-    OC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
+    OIC_LOG(ERROR, TAG, "FindAndSetValue reached point after while loop, pointer corruption?");
     return NULL;
 }
 
@@ -537,13 +551,21 @@ bool OCRepPayloadGetPropDouble(const OCRepPayload* payload, const char* name, do
 {
     OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
 
-    if (!val || val->type != OCREP_PROP_DOUBLE)
+    if (val)
     {
-        return false;
+        if (val->type == OCREP_PROP_DOUBLE)
+        {
+            *value = val->d;
+            return true;
+        }
+        else if (val->type == OCREP_PROP_INT)
+        {
+            *value = val->i;
+            return true;
+        }
     }
 
-    *value = val->d;
-    return true;
+    return false;
 }
 
 bool OCRepPayloadSetPropString(OCRepPayload* payload, const char* name, const char* value)
@@ -931,7 +953,8 @@ bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
 {
     OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name);
 
-    if (!val || val->type != OCREP_PROP_ARRAY || val->arr.type != OCREP_PROP_DOUBLE
+    if (!val || val->type != OCREP_PROP_ARRAY ||
+        (val->arr.type != OCREP_PROP_DOUBLE && val->arr.type != OCREP_PROP_INT)
             || !val->arr.dArray)
     {
         return false;
@@ -948,7 +971,19 @@ bool OCRepPayloadGetDoubleArray(const OCRepPayload* payload, const char* name,
         return false;
     }
 
-    memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
+    if (val->arr.type != OCREP_PROP_DOUBLE)
+    {
+        memcpy(*array, val->arr.dArray, dimTotal * sizeof(double));
+    }
+    else
+    {
+        /* need to convert from integer */
+        size_t n = 0;
+        for ( ; n < dimTotal; ++n)
+        {
+            (*array)[n] = val->arr.iArray[n];
+        }
+    }
     memcpy(dimensions, val->arr.dimensions, MAX_REP_ARRAY_DEPTH * sizeof(size_t));
     return true;
 }
@@ -1290,7 +1325,7 @@ OCDiscoveryPayload* OCDiscoveryPayloadCreate()
     return payload;
 }
 
-OCSecurityPayload* OCSecurityPayloadCreate(const char* securityData)
+OCSecurityPayload* OCSecurityPayloadCreate(const uint8_t* securityData, size_t size)
 {
     OCSecurityPayload* payload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
 
@@ -1300,7 +1335,14 @@ OCSecurityPayload* OCSecurityPayloadCreate(const char* securityData)
     }
 
     payload->base.type = PAYLOAD_TYPE_SECURITY;
-    payload->securityData = OICStrdup(securityData);
+    payload->securityData = (uint8_t *)OICCalloc(1, size);
+    if (!payload->securityData)
+    {
+        OICFree(payload);
+        return NULL;
+    }
+    memcpy(payload->securityData, (uint8_t *)securityData, size);
+    payload->payloadSize = size;
 
     return payload;
 }
@@ -1356,7 +1398,7 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
 
     if (!pl->uri)
     {
-        FreeOCDiscoveryResource(pl);
+        OCDiscoveryResourceDestroy(pl);
         return NULL;
     }
 
@@ -1368,13 +1410,13 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
         pl->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
         if (!pl->types)
         {
-            FreeOCDiscoveryResource(pl);
+            OCDiscoveryResourceDestroy(pl);
             return NULL;
         }
         pl->types->value = OICStrdup(typePtr->resourcetypename);
         if (!pl->types->value)
         {
-            FreeOCDiscoveryResource(pl);
+            OCDiscoveryResourceDestroy(pl);
             return NULL;
         }
 
@@ -1385,13 +1427,13 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
             cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
             if (!cur->next)
             {
-                FreeOCDiscoveryResource(pl);
+                OCDiscoveryResourceDestroy(pl);
                 return NULL;
             }
             cur->next->value = OICStrdup(typePtr->resourcetypename);
             if (!cur->next->value)
             {
-                FreeOCDiscoveryResource(pl);
+                OCDiscoveryResourceDestroy(pl);
                 return NULL;
             }
             cur = cur->next;
@@ -1406,13 +1448,13 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
         pl->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
         if (!pl->interfaces)
         {
-            FreeOCDiscoveryResource(pl);
+            OCDiscoveryResourceDestroy(pl);
             return NULL;
         }
         pl->interfaces->value = OICStrdup(ifPtr->name);
         if (!pl->interfaces->value)
         {
-            FreeOCDiscoveryResource(pl);
+            OCDiscoveryResourceDestroy(pl);
             return NULL;
         }
 
@@ -1423,13 +1465,13 @@ static OCResourcePayload* OCCopyResource(const OCResource* res, uint16_t port)
             cur->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
             if (!cur->next)
             {
-                FreeOCDiscoveryResource(pl);
+                OCDiscoveryResourceDestroy(pl);
                 return NULL;
             }
             cur->next->value = OICStrdup(ifPtr->name);
             if (!cur->next->value)
             {
-                FreeOCDiscoveryResource(pl);
+                OCDiscoveryResourceDestroy(pl);
                 return NULL;
             }
             cur = cur->next;
@@ -1450,102 +1492,34 @@ void OCDiscoveryPayloadAddResource(OCDiscoveryPayload* payload, const OCResource
     OCDiscoveryPayloadAddNewResource(payload, OCCopyResource(res, port));
 }
 
-bool OCResourcePayloadAddResourceType(OCResourcePayload* payload, const char* resourceType)
-{
-    if (!resourceType || !payload)
-    {
-        return false;
-    }
-
-    char* dup = OICStrdup(resourceType);
-
-    if (!dup)
-    {
-        return false;
-    }
-
-    if (!payload->types)
-    {
-        payload->types = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
-
-        if (!payload->types)
-        {
-            OICFree(dup);
-            return false;
-        }
-
-        payload->types->value = dup;
-        return true;
-    }
-
-    else
-    {
-        OCStringLL* temp = payload->types;
-
-        while(temp->next)
-        {
-            temp = temp->next;
-        }
-
-        temp->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
-        if (!temp->next)
-        {
-            OICFree(dup);
-            return false;
-        }
-
-        temp->next->value = dup;
-        return true;
-    }
-}
-
-bool OCResourcePayloadAddInterface(OCResourcePayload* payload, const char* interface)
+bool OCResourcePayloadAddStringLL(OCStringLL **stringLL, const char *value)
 {
-    if (!interface || !payload)
-    {
-        return false;
-    }
-
-    char* dup = OICStrdup(interface);
-
-    if (!dup)
-    {
-        return false;
-    }
+    char *dup = OICStrdup(value);
+    VERIFY_PARAM_NON_NULL(TAG, dup, "Failed copying string");
+    VERIFY_PARAM_NON_NULL(TAG, value, "Invalid Parameters");
 
-    if (!payload->interfaces)
+    if (!*stringLL)
     {
-        payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
-
-        if (!payload->interfaces)
-        {
-            OICFree(dup);
-            return false;
-        }
-
-        payload->interfaces->value = dup;
+        *stringLL = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
+        VERIFY_PARAM_NON_NULL(TAG, *stringLL, "Failed allocating memory");
+        (*stringLL)->value = dup;
         return true;
     }
-
     else
     {
-        OCStringLL* temp = payload->interfaces;
-
+        OCStringLL *temp = *stringLL;
         while(temp->next)
         {
             temp = temp->next;
         }
-
-        temp->next = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
-        if (!temp->next)
-        {
-            OICFree(dup);
-            return false;
-        }
-
+        temp->next = (OCStringLL *)OICCalloc(1, sizeof(OCStringLL));
+        VERIFY_PARAM_NON_NULL(TAG, temp->next, "Failed allocating memory");
         temp->next->value = dup;
         return true;
     }
+exit:
+    OICFree(dup);
+    return false;
 }
 
 void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePayload* res)
@@ -1570,7 +1544,7 @@ void OCDiscoveryPayloadAddNewResource(OCDiscoveryPayload* payload, OCResourcePay
     }
 }
 
-static void FreeOCDiscoveryResource(OCResourcePayload* payload)
+void OCDiscoveryResourceDestroy(OCResourcePayload* payload)
 {
     if (!payload)
     {
@@ -1580,7 +1554,7 @@ static void FreeOCDiscoveryResource(OCResourcePayload* payload)
     OICFree(payload->uri);
     OCFreeOCStringLL(payload->types);
     OCFreeOCStringLL(payload->interfaces);
-    FreeOCDiscoveryResource(payload->next);
+    OCDiscoveryResourceDestroy(payload->next);
     OICFree(payload);
 
 }
@@ -1591,12 +1565,17 @@ void OCDiscoveryPayloadDestroy(OCDiscoveryPayload* payload)
         return;
     }
     OICFree(payload->sid);
-    FreeOCDiscoveryResource(payload->resources);
+    OICFree(payload->baseURI);
+    OICFree(payload->uri);
+    OICFree(payload->type);
+    OICFree(payload->name);
+    OCFreeOCStringLL(payload->interface);
+    OCDiscoveryResourceDestroy(payload->resources);
     OICFree(payload);
 }
 
-OCDevicePayload* OCDevicePayloadCreate(const uint8_t* sid, const char* dname,
-        const char* specVer, const char* dmVer)
+OCDevicePayload* OCDevicePayloadCreate(const char* sid, const char* dname,
+        const OCStringLL *types, const char* specVer, const char* dmVer)
 {
 
     OCDevicePayload* payload = (OCDevicePayload*)OICCalloc(1, sizeof(OCDevicePayload));
@@ -1607,15 +1586,10 @@ OCDevicePayload* OCDevicePayloadCreate(const uint8_t* sid, const char* dname,
     }
 
     payload->base.type = PAYLOAD_TYPE_DEVICE;
-
-    if (sid)
+    payload->sid = OICStrdup(sid);
+    if (sid && !payload->sid)
     {
-        payload->sid = (uint8_t*)OICMalloc(UUID_SIZE);
-        if (!payload->sid)
-        {
-            goto exit;
-        }
-        memcpy(payload->sid, sid, UUID_SIZE);
+        goto exit;
     }
 
     payload->deviceName = OICStrdup(dname);
@@ -1636,6 +1610,12 @@ OCDevicePayload* OCDevicePayloadCreate(const uint8_t* sid, const char* dname,
         goto exit;
     }
 
+    payload->types = CloneOCStringLL((OCStringLL *)types);
+    if (types && !payload->types)
+    {
+        goto exit;
+    }
+
     return payload;
 
 exit:
@@ -1654,6 +1634,7 @@ void OCDevicePayloadDestroy(OCDevicePayload* payload)
     OICFree(payload->deviceName);
     OICFree(payload->specVersion);
     OICFree(payload->dataModelVersion);
+    OCFreeOCStringLL(payload->types);
     OICFree(payload);
 }
 
@@ -1686,6 +1667,14 @@ OCPlatformPayload* OCPlatformPayloadCreateAsOwner(OCPlatformInfo* platformInfo)
     }
 
     payload->base.type = PAYLOAD_TYPE_PLATFORM;
+
+    payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
+    if (!payload->interfaces)
+    {
+        return NULL;
+    }
+    payload->interfaces->value = OICStrdup(OC_RSRVD_INTERFACE_READ);
+    payload->rt = OICStrdup(OC_RSRVD_RESOURCE_TYPE_PLATFORM);
     payload->info = *platformInfo;
 
     return payload;
@@ -1701,11 +1690,34 @@ OCPlatformPayload* OCPlatformPayloadCreate(const OCPlatformInfo* platformInfo)
     }
 
     payload->base.type = PAYLOAD_TYPE_PLATFORM;
+
+    payload->interfaces = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL));
+    if (!payload->interfaces)
+    {
+        return NULL;
+    }
+    payload->interfaces->value = OICStrdup(OC_RSRVD_INTERFACE_READ);
+    payload->rt = OICStrdup(OC_RSRVD_RESOURCE_TYPE_PLATFORM);
     OCCopyPlatformInfo(platformInfo, payload);
 
     return payload;
 }
 
+void OCPlatformInfoDestroy(OCPlatformInfo *info)
+{
+    OICFree(info->platformID);
+    OICFree(info->manufacturerName);
+    OICFree(info->manufacturerUrl);
+    OICFree(info->modelNumber);
+    OICFree(info->dateOfManufacture);
+    OICFree(info->platformVersion);
+    OICFree(info->operatingSystemVersion);
+    OICFree(info->hardwareVersion);
+    OICFree(info->firmwareVersion);
+    OICFree(info->supportUrl);
+    OICFree(info->systemTime);
+}
+
 void OCPlatformPayloadDestroy(OCPlatformPayload* payload)
 {
     if (!payload)
@@ -1713,17 +1725,9 @@ void OCPlatformPayloadDestroy(OCPlatformPayload* payload)
         return;
     }
     OICFree(payload->uri);
-    OICFree(payload->info.platformID);
-    OICFree(payload->info.manufacturerName);
-    OICFree(payload->info.manufacturerUrl);
-    OICFree(payload->info.modelNumber);
-    OICFree(payload->info.dateOfManufacture);
-    OICFree(payload->info.platformVersion);
-    OICFree(payload->info.operatingSystemVersion);
-    OICFree(payload->info.hardwareVersion);
-    OICFree(payload->info.firmwareVersion);
-    OICFree(payload->info.supportUrl);
-    OICFree(payload->info.systemTime);
+    OCPlatformInfoDestroy(&payload->info);
+    OICFree(payload->rt);
+    OCFreeOCStringLL(payload->interfaces);
     OICFree(payload);
 }