Commit based upon d6442850bde61f0c3e7e2ae3247b4a856073c5e0
[librecmc/package-feed.git] / net / iotivity / patches / 053-src-move-OCClientResponse-from-stack-to-heap.patch
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      }