From 7fb5b6a19b06dc5b0a7f32261551b206b1e6a563 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 8 Jan 2017 19:24:26 +0100 Subject: [PATCH 3/3] src: move OCClientResponse from stack to heap OCClientResponse is about 50KByte and should not be stored on the stack. On LEDE with MIPS, musl libc this causes a segmentation fault. Moving this structure to the heap is the simple solution for this problem, but this structure should be shrinked. Change-Id: I7887f93450f45b8031fcdfffb9ee2214fc3d5dd2 Signed-off-by: Hauke Mehrtens --- resource/src/InProcServerWrapper.cpp | 44 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 18 deletions(-) --- a/resource/src/InProcServerWrapper.cpp +++ b/resource/src/InProcServerWrapper.cpp @@ -568,51 +568,58 @@ namespace OC } else { - OCEntityHandlerResponse response; + OCEntityHandlerResponse *response = NULL; + + response = (OCEntityHandlerResponse *)OICCalloc(1, sizeof(*response)); + if (!response) { + result = OC_STACK_MALFORMED_RESPONSE; + throw OCException(OC::Exception::STR_NULL_RESPONSE, OC_STACK_MALFORMED_RESPONSE); + } + // OCRepPayload* payLoad = pResponse->getPayload(); HeaderOptions serverHeaderOptions = pResponse->getHeaderOptions(); - response.requestHandle = pResponse->getRequestHandle(); - response.resourceHandle = pResponse->getResourceHandle(); - response.ehResult = pResponse->getResponseResult(); + response->requestHandle = pResponse->getRequestHandle(); + response->resourceHandle = pResponse->getResourceHandle(); + response->ehResult = pResponse->getResponseResult(); - response.payload = reinterpret_cast(pResponse->getPayload()); + response->payload = reinterpret_cast(pResponse->getPayload()); - response.persistentBufferFlag = 0; + response->persistentBufferFlag = 0; - response.numSendVendorSpecificHeaderOptions = serverHeaderOptions.size(); + response->numSendVendorSpecificHeaderOptions = serverHeaderOptions.size(); int i = 0; for (auto it=serverHeaderOptions.begin(); it != serverHeaderOptions.end(); ++it) { - response.sendVendorSpecificHeaderOptions[i].protocolID = OC_COAP_ID; - response.sendVendorSpecificHeaderOptions[i].optionID = + response->sendVendorSpecificHeaderOptions[i].protocolID = OC_COAP_ID; + response->sendVendorSpecificHeaderOptions[i].optionID = static_cast(it->getOptionID()); - response.sendVendorSpecificHeaderOptions[i].optionLength = + response->sendVendorSpecificHeaderOptions[i].optionLength = (it->getOptionData()).length() + 1; std::string optionData = it->getOptionData(); std::copy(optionData.begin(), optionData.end(), - response.sendVendorSpecificHeaderOptions[i].optionData); - response.sendVendorSpecificHeaderOptions[i].optionData[it->getOptionData().length()] + response->sendVendorSpecificHeaderOptions[i].optionData); + response->sendVendorSpecificHeaderOptions[i].optionData[it->getOptionData().length()] = '\0'; i++; } - if(OC_EH_RESOURCE_CREATED == response.ehResult) + if(OC_EH_RESOURCE_CREATED == response->ehResult) { - pResponse->getNewResourceUri().copy(response.resourceUri, - sizeof (response.resourceUri) - 1); - response.resourceUri[pResponse->getNewResourceUri().length()] = '\0'; + pResponse->getNewResourceUri().copy(response->resourceUri, + sizeof (response->resourceUri) - 1); + response->resourceUri[pResponse->getNewResourceUri().length()] = '\0'; } if(cLock) { std::lock_guard lock(*cLock); - result = OCDoResponse(&response); + result = OCDoResponse(response); } else { - OICFree(response.payload); + OICFree(response->payload); result = OC_STACK_ERROR; } @@ -620,6 +627,7 @@ namespace OC { oclog() << "Error sending response\n"; } + OICFree(response); return result; } }