123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- 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,
|