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 }