050-csdk-move-OCEntityHandlerResponse-from-stack-to-heap.patch (2173B)
1 From d8cf30cb0abd5fa8f6282b490618204d683b625c Mon Sep 17 00:00:00 2001 2 From: Hauke Mehrtens <hauke@hauke-m.de> 3 Date: Mon, 3 Oct 2016 21:00:28 +0200 4 Subject: [PATCH 1/3] csdk: move OCEntityHandlerResponse from stack to heap 5 6 OCEntityHandlerResponse is over 50KByte and I got a stack overflow on MIPS 7 running on LEDE without this patch. Instead of storing 8 OCEntityHandlerResponse on the program stack, allocate some memory on 9 the heap and free it afterwards again. 10 11 This fixes one part of this issue for me: 12 https://jira.iotivity.org/browse/IOT-1374 13 14 Change-Id: I365a5c7a34dce2dfb0897a20b57a13ba566748ec 15 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> 16 --- 17 resource/csdk/stack/src/ocresource.c | 24 +++++++++++++++++------- 18 1 file changed, 17 insertions(+), 7 deletions(-) 19 20 --- a/resource/csdk/stack/src/ocresource.c 21 +++ b/resource/csdk/stack/src/ocresource.c 22 @@ -774,15 +774,25 @@ static bool includeThisResourceInRespons 23 OCStackResult SendNonPersistantDiscoveryResponse(OCServerRequest *request, OCResource *resource, 24 OCPayload *discoveryPayload, OCEntityHandlerResult ehResult) 25 { 26 - OCEntityHandlerResponse response = {0}; 27 + OCEntityHandlerResponse *response = NULL; 28 + OCStackResult result = OC_STACK_ERROR; 29 30 - response.ehResult = ehResult; 31 - response.payload = discoveryPayload; 32 - response.persistentBufferFlag = 0; 33 - response.requestHandle = (OCRequestHandle) request->requestId; 34 - response.resourceHandle = (OCResourceHandle) resource; 35 + response = (OCEntityHandlerResponse *)OICCalloc(1, sizeof(*response)); 36 + VERIFY_PARAM_NON_NULL(TAG, response, "Failed allocating OCEntityHandlerResponse"); 37 38 - return OCDoResponse(&response); 39 + response->ehResult = ehResult; 40 + response->payload = discoveryPayload; 41 + response->persistentBufferFlag = 0; 42 + response->requestHandle = (OCRequestHandle) request->requestId; 43 + response->resourceHandle = (OCResourceHandle) resource; 44 + 45 + result = OCDoResponse(response); 46 + 47 + OICFree(response); 48 + return result; 49 + 50 +exit: 51 + return OC_STACK_NO_MEMORY; 52 } 53 54 static OCStackResult EHRequest(OCEntityHandlerRequest *ehRequest, OCPayloadType type,