Update snapshot(2017-12-06)
[platform/upstream/iotivity.git] / resource / csdk / routing / src / routingmessageparser.c
index 7ee337c..81f460a 100644 (file)
@@ -278,12 +278,10 @@ OCStackResult RMPParseResponsePayload(const OCRepPayload *payload, uint32_t *gat
         return OC_STACK_OK;
     }
 
-    OCRepPayload **responsePayload[len];
-
+    OCRepPayload **responsePayload = NULL;
     size_t dimensions[MAX_REP_ARRAY_DEPTH];
-    OCRepPayloadGetPropObjectArray(payload, TABLE, responsePayload, dimensions);
-
-    if (NULL == *responsePayload)
+    OCRepPayloadGetPropObjectArray(payload, TABLE, &responsePayload, dimensions);
+    if (NULL == responsePayload)
     {
         OIC_LOG(DEBUG, TAG, "RMPParsePayload OUT");
         return OC_STACK_OK;
@@ -293,17 +291,17 @@ OCStackResult RMPParseResponsePayload(const OCRepPayload *payload, uint32_t *gat
     if (NULL == *gatewayTable)
     {
         OIC_LOG(DEBUG, TAG, "Gateway table create failed");
-        return OC_STACK_ERROR;
+        goto error_exit;
     }
 
+    size_t resPayloadSize = calcDimTotal(dimensions);
     for (int i = 0; i < len; i++)
     {
         RTMGatewayEntry_t *entry = (RTMGatewayEntry_t *)OICCalloc(1, sizeof(RTMGatewayEntry_t));
-
         if (NULL == entry)
         {
             OIC_LOG(DEBUG, TAG, "RTMGatewayEntry_t Calloc failed");
-            return OC_STACK_ERROR;
+            goto error_exit;
         }
         // Filling new Entry
         entry->destination = (RTMGatewayId_t*)OICCalloc(1, sizeof(RTMGatewayId_t));
@@ -311,7 +309,7 @@ OCStackResult RMPParseResponsePayload(const OCRepPayload *payload, uint32_t *gat
         {
             OIC_LOG(DEBUG, TAG, "Destination Calloc failed");
             OICFree(entry);
-            return OC_STACK_ERROR;
+            goto error_exit;
         }
         entry->nextHop = (RTMGatewayId_t*)OICCalloc(1, sizeof(RTMGatewayId_t));
         if (NULL == entry->nextHop)
@@ -319,22 +317,37 @@ OCStackResult RMPParseResponsePayload(const OCRepPayload *payload, uint32_t *gat
             OIC_LOG(DEBUG, TAG, "nextHop Calloc failed");
             OICFree(entry->destination);
             OICFree(entry);
-            return OC_STACK_ERROR;
+            goto error_exit;
         }
 
         entry->nextHop->gatewayId = *gatewayId;
 
         int64_t gatewayBuf;
         int64_t routeCost;
-        OCRepPayloadGetPropInt(*((*responsePayload) + i), GATEWAY, &gatewayBuf);
-        OCRepPayloadGetPropInt(*((*responsePayload) + i), ROUTE_COST, &routeCost);
+        OCRepPayloadGetPropInt(responsePayload[i], GATEWAY, &gatewayBuf);
+        OCRepPayloadGetPropInt(responsePayload[i], ROUTE_COST, &routeCost);
 
         entry->destination->gatewayId = gatewayBuf;
         entry->routeCost = routeCost;
         u_linklist_add(*gatewayTable, (void *)entry);
     }
+
+    for (size_t k = 0; k < resPayloadSize; k++)
+    {
+        OCRepPayloadDestroy(responsePayload[k]);
+    }
+    OICFree(responsePayload);
+
     OIC_LOG(DEBUG, TAG, "RMPParsePayload OUT");
     return OC_STACK_OK;
+
+error_exit:
+    for (size_t k = 0; k < resPayloadSize; k++)
+    {
+        OCRepPayloadDestroy(responsePayload[k]);
+    }
+    OICFree(responsePayload);
+    return OC_STACK_ERROR;
 }
 
 void RMPFreePayload(OCRepPayload *payload)