lede-packages-rs

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

053-src-move-OCClientResponse-from-stack-to-heap.patch (4786B)


      1 From 7fb5b6a19b06dc5b0a7f32261551b206b1e6a563 Mon Sep 17 00:00:00 2001
      2 From: Hauke Mehrtens <hauke@hauke-m.de>
      3 Date: Sun, 8 Jan 2017 19:24:26 +0100
      4 Subject: [PATCH 3/3] src: 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 shrinked.
     10 
     11 Change-Id: I7887f93450f45b8031fcdfffb9ee2214fc3d5dd2
     12 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
     13 ---
     14  resource/src/InProcServerWrapper.cpp | 44 +++++++++++++++++++++---------------
     15  1 file changed, 26 insertions(+), 18 deletions(-)
     16 
     17 --- a/resource/src/InProcServerWrapper.cpp
     18 +++ b/resource/src/InProcServerWrapper.cpp
     19 @@ -568,51 +568,58 @@ namespace OC
     20          }
     21          else
     22          {
     23 -            OCEntityHandlerResponse response;
     24 +            OCEntityHandlerResponse *response = NULL;
     25 +
     26 +            response = (OCEntityHandlerResponse *)OICCalloc(1, sizeof(*response));
     27 +            if (!response) {
     28 +                result = OC_STACK_MALFORMED_RESPONSE;
     29 +                throw OCException(OC::Exception::STR_NULL_RESPONSE, OC_STACK_MALFORMED_RESPONSE);
     30 +            }
     31 +
     32  //            OCRepPayload* payLoad = pResponse->getPayload();
     33              HeaderOptions serverHeaderOptions = pResponse->getHeaderOptions();
     34  
     35 -            response.requestHandle = pResponse->getRequestHandle();
     36 -            response.resourceHandle = pResponse->getResourceHandle();
     37 -            response.ehResult = pResponse->getResponseResult();
     38 +            response->requestHandle = pResponse->getRequestHandle();
     39 +            response->resourceHandle = pResponse->getResourceHandle();
     40 +            response->ehResult = pResponse->getResponseResult();
     41  
     42 -            response.payload = reinterpret_cast<OCPayload*>(pResponse->getPayload());
     43 +            response->payload = reinterpret_cast<OCPayload*>(pResponse->getPayload());
     44  
     45 -            response.persistentBufferFlag = 0;
     46 +            response->persistentBufferFlag = 0;
     47  
     48 -            response.numSendVendorSpecificHeaderOptions = serverHeaderOptions.size();
     49 +            response->numSendVendorSpecificHeaderOptions = serverHeaderOptions.size();
     50              int i = 0;
     51              for (auto it=serverHeaderOptions.begin(); it != serverHeaderOptions.end(); ++it)
     52              {
     53 -                response.sendVendorSpecificHeaderOptions[i].protocolID = OC_COAP_ID;
     54 -                response.sendVendorSpecificHeaderOptions[i].optionID =
     55 +                response->sendVendorSpecificHeaderOptions[i].protocolID = OC_COAP_ID;
     56 +                response->sendVendorSpecificHeaderOptions[i].optionID =
     57                      static_cast<uint16_t>(it->getOptionID());
     58 -                response.sendVendorSpecificHeaderOptions[i].optionLength =
     59 +                response->sendVendorSpecificHeaderOptions[i].optionLength =
     60                      (it->getOptionData()).length() + 1;
     61                  std::string optionData = it->getOptionData();
     62                  std::copy(optionData.begin(),
     63                           optionData.end(),
     64 -                         response.sendVendorSpecificHeaderOptions[i].optionData);
     65 -                response.sendVendorSpecificHeaderOptions[i].optionData[it->getOptionData().length()]
     66 +                         response->sendVendorSpecificHeaderOptions[i].optionData);
     67 +                response->sendVendorSpecificHeaderOptions[i].optionData[it->getOptionData().length()]
     68                      = '\0';
     69                  i++;
     70              }
     71  
     72 -            if(OC_EH_RESOURCE_CREATED == response.ehResult)
     73 +            if(OC_EH_RESOURCE_CREATED == response->ehResult)
     74              {
     75 -                pResponse->getNewResourceUri().copy(response.resourceUri,
     76 -                        sizeof (response.resourceUri) - 1);
     77 -                response.resourceUri[pResponse->getNewResourceUri().length()] = '\0';
     78 +                pResponse->getNewResourceUri().copy(response->resourceUri,
     79 +                        sizeof (response->resourceUri) - 1);
     80 +                response->resourceUri[pResponse->getNewResourceUri().length()] = '\0';
     81              }
     82  
     83              if(cLock)
     84              {
     85                  std::lock_guard<std::recursive_mutex> lock(*cLock);
     86 -                result = OCDoResponse(&response);
     87 +                result = OCDoResponse(response);
     88              }
     89              else
     90              {
     91 -                OICFree(response.payload);
     92 +                OICFree(response->payload);
     93                  result = OC_STACK_ERROR;
     94              }
     95  
     96 @@ -620,6 +627,7 @@ namespace OC
     97              {
     98                  oclog() << "Error sending response\n";
     99              }
    100 +            OICFree(response);
    101              return result;
    102          }
    103      }