From d8cf30cb0abd5fa8f6282b490618204d683b625c Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Mon, 3 Oct 2016 21:00:28 +0200 Subject: [PATCH 1/3] csdk: move OCEntityHandlerResponse from stack to heap OCEntityHandlerResponse is over 50KByte and I got a stack overflow on MIPS running on LEDE without this patch. Instead of storing OCEntityHandlerResponse on the program stack, allocate some memory on the heap and free it afterwards again. This fixes one part of this issue for me: https://jira.iotivity.org/browse/IOT-1374 Change-Id: I365a5c7a34dce2dfb0897a20b57a13ba566748ec Signed-off-by: Hauke Mehrtens --- resource/csdk/stack/src/ocresource.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@ -774,15 +774,25 @@ static bool includeThisResourceInRespons OCStackResult SendNonPersistantDiscoveryResponse(OCServerRequest *request, OCResource *resource, OCPayload *discoveryPayload, OCEntityHandlerResult ehResult) { - OCEntityHandlerResponse response = {0}; + OCEntityHandlerResponse *response = NULL; + OCStackResult result = OC_STACK_ERROR; - response.ehResult = ehResult; - response.payload = discoveryPayload; - response.persistentBufferFlag = 0; - response.requestHandle = (OCRequestHandle) request->requestId; - response.resourceHandle = (OCResourceHandle) resource; + response = (OCEntityHandlerResponse *)OICCalloc(1, sizeof(*response)); + VERIFY_PARAM_NON_NULL(TAG, response, "Failed allocating OCEntityHandlerResponse"); - return OCDoResponse(&response); + response->ehResult = ehResult; + response->payload = discoveryPayload; + response->persistentBufferFlag = 0; + response->requestHandle = (OCRequestHandle) request->requestId; + response->resourceHandle = (OCResourceHandle) resource; + + result = OCDoResponse(response); + + OICFree(response); + return result; + +exit: + return OC_STACK_NO_MEMORY; } static OCStackResult EHRequest(OCEntityHandlerRequest *ehRequest, OCPayloadType type,