|
|
- From e8971dd4914c9d42938c4c885b4ac6d784d7e0ff Mon Sep 17 00:00:00 2001
- From: Hauke Mehrtens <hauke@hauke-m.de>
- Date: Mon, 3 Oct 2016 23:22:36 +0200
- Subject: [PATCH 2/3] csdk: 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 shrined.
-
- There are probably more places were this is stored on the stack and
- will cause problems. This fixes the other issue I saw in
- https://jira.iotivity.org/browse/IOT-1374
-
- Change-Id: I45d8aee4a8151fea51d3318acb1eea61ce579060
- Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
- ---
- resource/csdk/stack/src/ocstack.c | 163 ++++++++++++++++++++++++--------------
- 1 file changed, 102 insertions(+), 61 deletions(-)
-
- --- a/resource/csdk/stack/src/ocstack.c
- +++ b/resource/csdk/stack/src/ocstack.c
- @@ -1042,7 +1042,7 @@ OCStackResult HandlePresenceResponse(con
- OCStackApplicationResult cbResult = OC_STACK_DELETE_TRANSACTION;
- ClientCB * cbNode = NULL;
- char *resourceTypeName = NULL;
- - OCClientResponse response = {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
- + OCClientResponse *response = NULL;
- OCStackResult result = OC_STACK_ERROR;
- uint32_t maxAge = 0;
- int uriLen;
- @@ -1057,15 +1057,23 @@ OCStackResult HandlePresenceResponse(con
- return OC_STACK_ERROR;
- }
-
- - response.payload = NULL;
- - response.result = OC_STACK_OK;
- + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
- + if (!response)
- + {
- + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
- + return OC_STACK_ERROR;
- + }
- + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
-
- - CopyEndpointToDevAddr(endpoint, &response.devAddr);
- - FixUpClientResponse(&response);
- + response->payload = NULL;
- + response->result = OC_STACK_OK;
- +
- + CopyEndpointToDevAddr(endpoint, &response->devAddr);
- + FixUpClientResponse(response);
-
- if (responseInfo->info.payload)
- {
- - result = OCParsePayload(&response.payload,
- + result = OCParsePayload(&response->payload,
- PAYLOAD_TYPE_PRESENCE,
- responseInfo->info.payload,
- responseInfo->info.payloadSize);
- @@ -1075,15 +1083,15 @@ OCStackResult HandlePresenceResponse(con
- OIC_LOG(ERROR, TAG, "Presence parse failed");
- goto exit;
- }
- - if(!response.payload || response.payload->type != PAYLOAD_TYPE_PRESENCE)
- + if(!response->payload || response->payload->type != PAYLOAD_TYPE_PRESENCE)
- {
- OIC_LOG(ERROR, TAG, "Presence payload was wrong type");
- result = OC_STACK_ERROR;
- goto exit;
- }
- - response.sequenceNumber = ((OCPresencePayload*)response.payload)->sequenceNumber;
- - resourceTypeName = ((OCPresencePayload*)response.payload)->resourceType;
- - maxAge = ((OCPresencePayload*)response.payload)->maxAge;
- + response->sequenceNumber = ((OCPresencePayload*)response->payload)->sequenceNumber;
- + resourceTypeName = ((OCPresencePayload*)response->payload)->resourceType;
- + maxAge = ((OCPresencePayload*)response->payload)->maxAge;
- }
-
- // check for unicast presence
- @@ -1091,6 +1099,7 @@ OCStackResult HandlePresenceResponse(con
- responseInfo->isMulticast);
- if (uriLen < 0 || (size_t)uriLen >= sizeof (presenceUri))
- {
- + OICFree(response);
- return OC_STACK_INVALID_URI;
- }
- OIC_LOG(ERROR, TAG, "check for unicast presence");
- @@ -1118,7 +1127,7 @@ OCStackResult HandlePresenceResponse(con
-
- if (presenceSubscribe)
- {
- - if(cbNode->sequenceNumber == response.sequenceNumber)
- + if(cbNode->sequenceNumber == response->sequenceNumber)
- {
- OIC_LOG(INFO, TAG, "No presence change");
- ResetPresenceTTL(cbNode, maxAge);
- @@ -1129,7 +1138,7 @@ OCStackResult HandlePresenceResponse(con
- if(maxAge == 0)
- {
- OIC_LOG(INFO, TAG, "Stopping presence");
- - response.result = OC_STACK_PRESENCE_STOPPED;
- + response->result = OC_STACK_PRESENCE_STOPPED;
- if(cbNode->presence)
- {
- OICFree(cbNode->presence->timeOut);
- @@ -1165,7 +1174,7 @@ OCStackResult HandlePresenceResponse(con
-
- ResetPresenceTTL(cbNode, maxAge);
-
- - cbNode->sequenceNumber = response.sequenceNumber;
- + cbNode->sequenceNumber = response->sequenceNumber;
- }
- }
- else
- @@ -1175,7 +1184,7 @@ OCStackResult HandlePresenceResponse(con
- if (0 == maxAge)
- {
- OIC_LOG(INFO, TAG, "Stopping presence");
- - response.result = OC_STACK_PRESENCE_STOPPED;
- + response->result = OC_STACK_PRESENCE_STOPPED;
- }
- }
-
- @@ -1191,7 +1200,7 @@ OCStackResult HandlePresenceResponse(con
-
- OIC_LOG(INFO, TAG, "Callback for presence");
-
- - cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &response);
- + cbResult = cbNode->callBack(cbNode->context, cbNode->handle, response);
-
- if (cbResult == OC_STACK_DELETE_TRANSACTION)
- {
- @@ -1199,7 +1208,8 @@ OCStackResult HandlePresenceResponse(con
- }
-
- exit:
- - OCPayloadDestroy(response.payload);
- + OCPayloadDestroy(response->payload);
- + OICFree(response);
- return result;
- }
-
- @@ -1240,36 +1250,53 @@ void OCHandleResponse(const CAEndpoint_t
- OIC_LOG(INFO, TAG, "Receiving A Timeout for this token");
- OIC_LOG(INFO, TAG, "Calling into application address space");
-
- - OCClientResponse response =
- - {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
- - CopyEndpointToDevAddr(endPoint, &response.devAddr);
- - FixUpClientResponse(&response);
- - response.resourceUri = responseInfo->info.resourceUri;
- - memcpy(response.identity.id, responseInfo->info.identity.id,
- - sizeof (response.identity.id));
- - response.identity.id_length = responseInfo->info.identity.id_length;
- + OCClientResponse *response = NULL;
- +
- + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
- + if (!response)
- + {
- + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
- + return;
- + }
- +
- + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
- + CopyEndpointToDevAddr(endPoint, &response->devAddr);
- + FixUpClientResponse(response);
- + response->resourceUri = responseInfo->info.resourceUri;
- + memcpy(response->identity.id, responseInfo->info.identity.id,
- + sizeof (response->identity.id));
- + response->identity.id_length = responseInfo->info.identity.id_length;
-
- - response.result = CAResponseToOCStackResult(responseInfo->result);
- + response->result = CAResponseToOCStackResult(responseInfo->result);
- cbNode->callBack(cbNode->context,
- - cbNode->handle, &response);
- + cbNode->handle, response);
- FindAndDeleteClientCB(cbNode);
- + OICFree(response);
- }
- else
- {
- OIC_LOG(INFO, TAG, "This is a regular response, A client call back is found");
- OIC_LOG(INFO, TAG, "Calling into application address space");
-
- - OCClientResponse response =
- - {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
- - response.sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
- - CopyEndpointToDevAddr(endPoint, &response.devAddr);
- - FixUpClientResponse(&response);
- - response.resourceUri = responseInfo->info.resourceUri;
- - memcpy(response.identity.id, responseInfo->info.identity.id,
- - sizeof (response.identity.id));
- - response.identity.id_length = responseInfo->info.identity.id_length;
- + OCClientResponse *response = NULL;
-
- - response.result = CAResponseToOCStackResult(responseInfo->result);
- + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
- + if (!response)
- + {
- + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
- + return;
- + }
- +
- + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
- + response->sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
- + CopyEndpointToDevAddr(endPoint, &response->devAddr);
- + FixUpClientResponse(response);
- + response->resourceUri = responseInfo->info.resourceUri;
- + memcpy(response->identity.id, responseInfo->info.identity.id,
- + sizeof (response->identity.id));
- + response->identity.id_length = responseInfo->info.identity.id_length;
- +
- + response->result = CAResponseToOCStackResult(responseInfo->result);
-
- if(responseInfo->info.payload &&
- responseInfo->info.payloadSize)
- @@ -1359,21 +1386,23 @@ void OCHandleResponse(const CAEndpoint_t
- {
- OIC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s",
- cbNode->method, cbNode->requestUri);
- + OICFree(response);
- return;
- }
-
- - if(OC_STACK_OK != OCParsePayload(&response.payload,
- + if(OC_STACK_OK != OCParsePayload(&response->payload,
- type,
- responseInfo->info.payload,
- responseInfo->info.payloadSize))
- {
- OIC_LOG(ERROR, TAG, "Error converting payload");
- - OCPayloadDestroy(response.payload);
- + OCPayloadDestroy(response->payload);
- + OICFree(response);
- return;
- }
- }
-
- - response.numRcvdVendorSpecificHeaderOptions = 0;
- + response->numRcvdVendorSpecificHeaderOptions = 0;
- if(responseInfo->info.numOptions > 0)
- {
- int start = 0;
- @@ -1391,19 +1420,20 @@ void OCHandleResponse(const CAEndpoint_t
- observationOption =
- (observationOption << 8) | optionData[i];
- }
- - response.sequenceNumber = observationOption;
- - response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
- + response->sequenceNumber = observationOption;
- + response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
- start = 1;
- }
- else
- {
- - response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
- + response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
- }
-
- - if(response.numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
- + if(response->numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
- {
- OIC_LOG(ERROR, TAG, "#header options are more than MAX_HEADER_OPTIONS");
- - OCPayloadDestroy(response.payload);
- + OCPayloadDestroy(response->payload);
- + OICFree(response);
- return;
- }
-
- @@ -1411,19 +1441,19 @@ void OCHandleResponse(const CAEndpoint_t
- {
- if(&(responseInfo->info.options[i]))
- {
- - memcpy (&(response.rcvdVendorSpecificHeaderOptions[i-start]),
- + memcpy (&(response->rcvdVendorSpecificHeaderOptions[i-start]),
- &(responseInfo->info.options[i]), sizeof(OCHeaderOption));
- }
- }
- }
-
- if (cbNode->method == OC_REST_OBSERVE &&
- - response.sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
- + response->sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
- cbNode->sequenceNumber <= MAX_SEQUENCE_NUMBER &&
- - response.sequenceNumber <= cbNode->sequenceNumber)
- + response->sequenceNumber <= cbNode->sequenceNumber)
- {
- OIC_LOG_V(INFO, TAG, "Received stale notification. Number :%d",
- - response.sequenceNumber);
- + response->sequenceNumber);
- }
- else
- {
- @@ -1432,13 +1462,13 @@ void OCHandleResponse(const CAEndpoint_t
- char *targetUri = strstr(cbNode->requestUri, OC_RSRVD_RD_URI);
- if (targetUri)
- {
- - OCUpdateResourceInsWithResponse(cbNode->requestUri, &response);
- + OCUpdateResourceInsWithResponse(cbNode->requestUri, response);
- }
- #endif
- OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context,
- cbNode->handle,
- - &response);
- - cbNode->sequenceNumber = response.sequenceNumber;
- + response);
- + cbNode->sequenceNumber = response->sequenceNumber;
-
- if (appFeedback == OC_STACK_DELETE_TRANSACTION)
- {
- @@ -1459,7 +1489,8 @@ void OCHandleResponse(const CAEndpoint_t
- CA_MSG_ACKNOWLEDGE, 0, NULL, NULL, 0, NULL, CA_RESPONSE_FOR_RES);
- }
-
- - OCPayloadDestroy(response.payload);
- + OCPayloadDestroy(response->payload);
- + OICFree(response);
- }
- return;
- }
- @@ -1585,16 +1616,26 @@ void HandleCAErrorResponse(const CAEndpo
- errorInfo->info.tokenLength, NULL, NULL);
- if (cbNode)
- {
- - OCClientResponse response = { .devAddr = { .adapter = OC_DEFAULT_ADAPTER } };
- - CopyEndpointToDevAddr(endPoint, &response.devAddr);
- - FixUpClientResponse(&response);
- - response.resourceUri = errorInfo->info.resourceUri;
- - memcpy(response.identity.id, errorInfo->info.identity.id,
- - sizeof (response.identity.id));
- - response.identity.id_length = errorInfo->info.identity.id_length;
- - response.result = CAResultToOCResult(errorInfo->result);
- + OCClientResponse *response = NULL;
- +
- + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
- + if (!response)
- + {
- + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
- + return;
- + }
- +
- + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
- + CopyEndpointToDevAddr(endPoint, &response->devAddr);
- + FixUpClientResponse(response);
- + response->resourceUri = errorInfo->info.resourceUri;
- + memcpy(response->identity.id, errorInfo->info.identity.id,
- + sizeof (response->identity.id));
- + response->identity.id_length = errorInfo->info.identity.id_length;
- + response->result = CAResultToOCResult(errorInfo->result);
-
- - cbNode->callBack(cbNode->context, cbNode->handle, &response);
- + cbNode->callBack(cbNode->context, cbNode->handle, response);
- + OICFree(response);
- }
-
- ResourceObserver *observer = GetObserverUsingToken(errorInfo->info.token,
|