lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

051-csdk-move-OCClientResponse-from-stack-to-heap.patch (15920B)


      1 From e8971dd4914c9d42938c4c885b4ac6d784d7e0ff Mon Sep 17 00:00:00 2001
      2 From: Hauke Mehrtens <hauke@hauke-m.de>
      3 Date: Mon, 3 Oct 2016 23:22:36 +0200
      4 Subject: [PATCH 2/3] csdk: move OCClientResponse from stack to heap
      5 
      6 OCClientResponse is about 50KByte and should not be stored on the
      7 stack. On LEDE with MIPS, musl libc this causes a segmentation fault.
      8 Moving this structure to the heap is the simple solution for this
      9 problem, but this structure should be shrined.
     10 
     11 There are probably more places were this is stored on the stack and
     12 will cause problems. This fixes the other issue I saw in
     13 https://jira.iotivity.org/browse/IOT-1374
     14 
     15 Change-Id: I45d8aee4a8151fea51d3318acb1eea61ce579060
     16 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
     17 ---
     18  resource/csdk/stack/src/ocstack.c | 163 ++++++++++++++++++++++++--------------
     19  1 file changed, 102 insertions(+), 61 deletions(-)
     20 
     21 --- a/resource/csdk/stack/src/ocstack.c
     22 +++ b/resource/csdk/stack/src/ocstack.c
     23 @@ -1042,7 +1042,7 @@ OCStackResult HandlePresenceResponse(con
     24      OCStackApplicationResult cbResult = OC_STACK_DELETE_TRANSACTION;
     25      ClientCB * cbNode = NULL;
     26      char *resourceTypeName = NULL;
     27 -    OCClientResponse response = {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
     28 +    OCClientResponse *response = NULL;
     29      OCStackResult result = OC_STACK_ERROR;
     30      uint32_t maxAge = 0;
     31      int uriLen;
     32 @@ -1057,15 +1057,23 @@ OCStackResult HandlePresenceResponse(con
     33          return OC_STACK_ERROR;
     34      }
     35  
     36 -    response.payload = NULL;
     37 -    response.result = OC_STACK_OK;
     38 +    response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
     39 +    if (!response)
     40 +    {
     41 +            OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
     42 +            return OC_STACK_ERROR;
     43 +    }
     44 +    response->devAddr.adapter = OC_DEFAULT_ADAPTER;
     45  
     46 -    CopyEndpointToDevAddr(endpoint, &response.devAddr);
     47 -    FixUpClientResponse(&response);
     48 +    response->payload = NULL;
     49 +    response->result = OC_STACK_OK;
     50 +
     51 +    CopyEndpointToDevAddr(endpoint, &response->devAddr);
     52 +    FixUpClientResponse(response);
     53  
     54      if (responseInfo->info.payload)
     55      {
     56 -        result = OCParsePayload(&response.payload,
     57 +        result = OCParsePayload(&response->payload,
     58                  PAYLOAD_TYPE_PRESENCE,
     59                  responseInfo->info.payload,
     60                  responseInfo->info.payloadSize);
     61 @@ -1075,15 +1083,15 @@ OCStackResult HandlePresenceResponse(con
     62              OIC_LOG(ERROR, TAG, "Presence parse failed");
     63              goto exit;
     64          }
     65 -        if(!response.payload || response.payload->type != PAYLOAD_TYPE_PRESENCE)
     66 +        if(!response->payload || response->payload->type != PAYLOAD_TYPE_PRESENCE)
     67          {
     68              OIC_LOG(ERROR, TAG, "Presence payload was wrong type");
     69              result = OC_STACK_ERROR;
     70              goto exit;
     71          }
     72 -        response.sequenceNumber = ((OCPresencePayload*)response.payload)->sequenceNumber;
     73 -        resourceTypeName = ((OCPresencePayload*)response.payload)->resourceType;
     74 -        maxAge = ((OCPresencePayload*)response.payload)->maxAge;
     75 +        response->sequenceNumber = ((OCPresencePayload*)response->payload)->sequenceNumber;
     76 +        resourceTypeName = ((OCPresencePayload*)response->payload)->resourceType;
     77 +        maxAge = ((OCPresencePayload*)response->payload)->maxAge;
     78      }
     79  
     80      // check for unicast presence
     81 @@ -1091,6 +1099,7 @@ OCStackResult HandlePresenceResponse(con
     82                                        responseInfo->isMulticast);
     83      if (uriLen < 0 || (size_t)uriLen >= sizeof (presenceUri))
     84      {
     85 +        OICFree(response);
     86          return OC_STACK_INVALID_URI;
     87      }
     88      OIC_LOG(ERROR, TAG, "check for unicast presence");
     89 @@ -1118,7 +1127,7 @@ OCStackResult HandlePresenceResponse(con
     90  
     91      if (presenceSubscribe)
     92      {
     93 -        if(cbNode->sequenceNumber == response.sequenceNumber)
     94 +        if(cbNode->sequenceNumber == response->sequenceNumber)
     95          {
     96              OIC_LOG(INFO, TAG, "No presence change");
     97              ResetPresenceTTL(cbNode, maxAge);
     98 @@ -1129,7 +1138,7 @@ OCStackResult HandlePresenceResponse(con
     99          if(maxAge == 0)
    100          {
    101              OIC_LOG(INFO, TAG, "Stopping presence");
    102 -            response.result = OC_STACK_PRESENCE_STOPPED;
    103 +            response->result = OC_STACK_PRESENCE_STOPPED;
    104              if(cbNode->presence)
    105              {
    106                  OICFree(cbNode->presence->timeOut);
    107 @@ -1165,7 +1174,7 @@ OCStackResult HandlePresenceResponse(con
    108  
    109              ResetPresenceTTL(cbNode, maxAge);
    110  
    111 -            cbNode->sequenceNumber = response.sequenceNumber;
    112 +            cbNode->sequenceNumber = response->sequenceNumber;
    113          }
    114      }
    115      else
    116 @@ -1175,7 +1184,7 @@ OCStackResult HandlePresenceResponse(con
    117          if (0 == maxAge)
    118          {
    119              OIC_LOG(INFO, TAG, "Stopping presence");
    120 -            response.result = OC_STACK_PRESENCE_STOPPED;
    121 +            response->result = OC_STACK_PRESENCE_STOPPED;
    122          }
    123      }
    124  
    125 @@ -1191,7 +1200,7 @@ OCStackResult HandlePresenceResponse(con
    126  
    127      OIC_LOG(INFO, TAG, "Callback for presence");
    128  
    129 -    cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &response);
    130 +    cbResult = cbNode->callBack(cbNode->context, cbNode->handle, response);
    131  
    132      if (cbResult == OC_STACK_DELETE_TRANSACTION)
    133      {
    134 @@ -1199,7 +1208,8 @@ OCStackResult HandlePresenceResponse(con
    135      }
    136  
    137  exit:
    138 -    OCPayloadDestroy(response.payload);
    139 +    OCPayloadDestroy(response->payload);
    140 +    OICFree(response);
    141      return result;
    142  }
    143  
    144 @@ -1240,36 +1250,53 @@ void OCHandleResponse(const CAEndpoint_t
    145              OIC_LOG(INFO, TAG, "Receiving A Timeout for this token");
    146              OIC_LOG(INFO, TAG, "Calling into application address space");
    147  
    148 -            OCClientResponse response =
    149 -                {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
    150 -            CopyEndpointToDevAddr(endPoint, &response.devAddr);
    151 -            FixUpClientResponse(&response);
    152 -            response.resourceUri = responseInfo->info.resourceUri;
    153 -            memcpy(response.identity.id, responseInfo->info.identity.id,
    154 -                                                sizeof (response.identity.id));
    155 -            response.identity.id_length = responseInfo->info.identity.id_length;
    156 +            OCClientResponse *response = NULL;
    157 +
    158 +            response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
    159 +            if (!response)
    160 +            {
    161 +                OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
    162 +                return;
    163 +            }
    164 +
    165 +            response->devAddr.adapter = OC_DEFAULT_ADAPTER;
    166 +            CopyEndpointToDevAddr(endPoint, &response->devAddr);
    167 +            FixUpClientResponse(response);
    168 +            response->resourceUri = responseInfo->info.resourceUri;
    169 +            memcpy(response->identity.id, responseInfo->info.identity.id,
    170 +                                                sizeof (response->identity.id));
    171 +            response->identity.id_length = responseInfo->info.identity.id_length;
    172  
    173 -            response.result = CAResponseToOCStackResult(responseInfo->result);
    174 +            response->result = CAResponseToOCStackResult(responseInfo->result);
    175              cbNode->callBack(cbNode->context,
    176 -                    cbNode->handle, &response);
    177 +                    cbNode->handle, response);
    178              FindAndDeleteClientCB(cbNode);
    179 +            OICFree(response);
    180          }
    181          else
    182          {
    183              OIC_LOG(INFO, TAG, "This is a regular response, A client call back is found");
    184              OIC_LOG(INFO, TAG, "Calling into application address space");
    185  
    186 -            OCClientResponse response =
    187 -                {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
    188 -            response.sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
    189 -            CopyEndpointToDevAddr(endPoint, &response.devAddr);
    190 -            FixUpClientResponse(&response);
    191 -            response.resourceUri = responseInfo->info.resourceUri;
    192 -            memcpy(response.identity.id, responseInfo->info.identity.id,
    193 -                                                sizeof (response.identity.id));
    194 -            response.identity.id_length = responseInfo->info.identity.id_length;
    195 +            OCClientResponse *response = NULL;
    196  
    197 -            response.result = CAResponseToOCStackResult(responseInfo->result);
    198 +            response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
    199 +            if (!response)
    200 +            {
    201 +                OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
    202 +                return;
    203 +            }
    204 +            
    205 +            response->devAddr.adapter = OC_DEFAULT_ADAPTER;
    206 +            response->sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
    207 +            CopyEndpointToDevAddr(endPoint, &response->devAddr);
    208 +            FixUpClientResponse(response);
    209 +            response->resourceUri = responseInfo->info.resourceUri;
    210 +            memcpy(response->identity.id, responseInfo->info.identity.id,
    211 +                                                sizeof (response->identity.id));
    212 +            response->identity.id_length = responseInfo->info.identity.id_length;
    213 +
    214 +            response->result = CAResponseToOCStackResult(responseInfo->result);
    215  
    216              if(responseInfo->info.payload &&
    217                 responseInfo->info.payloadSize)
    218 @@ -1359,21 +1386,23 @@ void OCHandleResponse(const CAEndpoint_t
    219                  {
    220                      OIC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s",
    221                              cbNode->method, cbNode->requestUri);
    222 +                    OICFree(response);
    223                      return;
    224                  }
    225  
    226 -                if(OC_STACK_OK != OCParsePayload(&response.payload,
    227 +                if(OC_STACK_OK != OCParsePayload(&response->payload,
    228                              type,
    229                              responseInfo->info.payload,
    230                              responseInfo->info.payloadSize))
    231                  {
    232                      OIC_LOG(ERROR, TAG, "Error converting payload");
    233 -                    OCPayloadDestroy(response.payload);
    234 +                    OCPayloadDestroy(response->payload);
    235 +                    OICFree(response);
    236                      return;
    237                  }
    238              }
    239  
    240 -            response.numRcvdVendorSpecificHeaderOptions = 0;
    241 +            response->numRcvdVendorSpecificHeaderOptions = 0;
    242              if(responseInfo->info.numOptions > 0)
    243              {
    244                  int start = 0;
    245 @@ -1391,19 +1420,20 @@ void OCHandleResponse(const CAEndpoint_t
    246                          observationOption =
    247                              (observationOption << 8) | optionData[i];
    248                      }
    249 -                    response.sequenceNumber = observationOption;
    250 -                    response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
    251 +                    response->sequenceNumber = observationOption;
    252 +                    response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
    253                      start = 1;
    254                  }
    255                  else
    256                  {
    257 -                    response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
    258 +                    response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
    259                  }
    260  
    261 -                if(response.numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
    262 +                if(response->numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
    263                  {
    264                      OIC_LOG(ERROR, TAG, "#header options are more than MAX_HEADER_OPTIONS");
    265 -                    OCPayloadDestroy(response.payload);
    266 +                    OCPayloadDestroy(response->payload);
    267 +                    OICFree(response);
    268                      return;
    269                  }
    270  
    271 @@ -1411,19 +1441,19 @@ void OCHandleResponse(const CAEndpoint_t
    272                  {
    273                      if(&(responseInfo->info.options[i]))
    274                      {
    275 -                        memcpy (&(response.rcvdVendorSpecificHeaderOptions[i-start]),
    276 +                        memcpy (&(response->rcvdVendorSpecificHeaderOptions[i-start]),
    277                                  &(responseInfo->info.options[i]), sizeof(OCHeaderOption));
    278                      }
    279                  }
    280              }
    281  
    282              if (cbNode->method == OC_REST_OBSERVE &&
    283 -                response.sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
    284 +                response->sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
    285                  cbNode->sequenceNumber <=  MAX_SEQUENCE_NUMBER &&
    286 -                response.sequenceNumber <= cbNode->sequenceNumber)
    287 +                response->sequenceNumber <= cbNode->sequenceNumber)
    288              {
    289                  OIC_LOG_V(INFO, TAG, "Received stale notification. Number :%d",
    290 -                                                 response.sequenceNumber);
    291 +                                                 response->sequenceNumber);
    292              }
    293              else
    294              {
    295 @@ -1432,13 +1462,13 @@ void OCHandleResponse(const CAEndpoint_t
    296                  char *targetUri = strstr(cbNode->requestUri, OC_RSRVD_RD_URI);
    297                  if (targetUri)
    298                  {
    299 -                    OCUpdateResourceInsWithResponse(cbNode->requestUri, &response);
    300 +                    OCUpdateResourceInsWithResponse(cbNode->requestUri, response);
    301                  }
    302  #endif
    303                  OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context,
    304                                                                          cbNode->handle,
    305 -                                                                        &response);
    306 -                cbNode->sequenceNumber = response.sequenceNumber;
    307 +                                                                        response);
    308 +                cbNode->sequenceNumber = response->sequenceNumber;
    309  
    310                  if (appFeedback == OC_STACK_DELETE_TRANSACTION)
    311                  {
    312 @@ -1459,7 +1489,8 @@ void OCHandleResponse(const CAEndpoint_t
    313                          CA_MSG_ACKNOWLEDGE, 0, NULL, NULL, 0, NULL, CA_RESPONSE_FOR_RES);
    314              }
    315  
    316 -            OCPayloadDestroy(response.payload);
    317 +            OCPayloadDestroy(response->payload);
    318 +            OICFree(response);
    319          }
    320          return;
    321      }
    322 @@ -1585,16 +1616,26 @@ void HandleCAErrorResponse(const CAEndpo
    323                                     errorInfo->info.tokenLength, NULL, NULL);
    324      if (cbNode)
    325      {
    326 -        OCClientResponse response = { .devAddr = { .adapter = OC_DEFAULT_ADAPTER } };
    327 -        CopyEndpointToDevAddr(endPoint, &response.devAddr);
    328 -        FixUpClientResponse(&response);
    329 -        response.resourceUri = errorInfo->info.resourceUri;
    330 -        memcpy(response.identity.id, errorInfo->info.identity.id,
    331 -               sizeof (response.identity.id));
    332 -        response.identity.id_length = errorInfo->info.identity.id_length;
    333 -        response.result = CAResultToOCResult(errorInfo->result);
    334 +        OCClientResponse *response = NULL;
    335 +
    336 +        response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
    337 +        if (!response)
    338 +        {
    339 +            OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
    340 +            return;
    341 +        }
    342 +
    343 +        response->devAddr.adapter = OC_DEFAULT_ADAPTER;
    344 +        CopyEndpointToDevAddr(endPoint, &response->devAddr);
    345 +        FixUpClientResponse(response);
    346 +        response->resourceUri = errorInfo->info.resourceUri;
    347 +        memcpy(response->identity.id, errorInfo->info.identity.id,
    348 +               sizeof (response->identity.id));
    349 +        response->identity.id_length = errorInfo->info.identity.id_length;
    350 +        response->result = CAResultToOCResult(errorInfo->result);
    351  
    352 -        cbNode->callBack(cbNode->context, cbNode->handle, &response);
    353 +        cbNode->callBack(cbNode->context, cbNode->handle, response);
    354 +        OICFree(response);
    355      }
    356  
    357      ResourceObserver *observer = GetObserverUsingToken(errorInfo->info.token,