1 From e8971dd4914c9d42938c4c885b4ac6d784d7e0ff Mon Sep 17 00:00:00 2001
2 From: Hauke Mehrtens <hauke@hauke-m.de>
3 Date: Mon, 3 Oct 2016 23:22:36 +0200
4 Subject: [PATCH 2/3] csdk: move OCClientResponse from stack to heap
6 OCClientResponse is about 50KByte and should not be stored on the
7 stack. On LEDE with MIPS, musl libc this causes a segmentation fault.
8 Moving this structure to the heap is the simple solution for this
9 problem, but this structure should be shrined.
11 There are probably more places were this is stored on the stack and
12 will cause problems. This fixes the other issue I saw in
13 https://jira.iotivity.org/browse/IOT-1374
15 Change-Id: I45d8aee4a8151fea51d3318acb1eea61ce579060
16 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
18 resource/csdk/stack/src/ocstack.c | 163 ++++++++++++++++++++++++--------------
19 1 file changed, 102 insertions(+), 61 deletions(-)
21 --- a/resource/csdk/stack/src/ocstack.c
22 +++ b/resource/csdk/stack/src/ocstack.c
23 @@ -1042,7 +1042,7 @@ OCStackResult HandlePresenceResponse(con
24 OCStackApplicationResult cbResult = OC_STACK_DELETE_TRANSACTION;
25 ClientCB * cbNode = NULL;
26 char *resourceTypeName = NULL;
27 - OCClientResponse response = {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
28 + OCClientResponse *response = NULL;
29 OCStackResult result = OC_STACK_ERROR;
32 @@ -1057,15 +1057,23 @@ OCStackResult HandlePresenceResponse(con
33 return OC_STACK_ERROR;
36 - response.payload = NULL;
37 - response.result = OC_STACK_OK;
38 + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
41 + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
42 + return OC_STACK_ERROR;
44 + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
46 - CopyEndpointToDevAddr(endpoint, &response.devAddr);
47 - FixUpClientResponse(&response);
48 + response->payload = NULL;
49 + response->result = OC_STACK_OK;
51 + CopyEndpointToDevAddr(endpoint, &response->devAddr);
52 + FixUpClientResponse(response);
54 if (responseInfo->info.payload)
56 - result = OCParsePayload(&response.payload,
57 + result = OCParsePayload(&response->payload,
58 PAYLOAD_TYPE_PRESENCE,
59 responseInfo->info.payload,
60 responseInfo->info.payloadSize);
61 @@ -1075,15 +1083,15 @@ OCStackResult HandlePresenceResponse(con
62 OIC_LOG(ERROR, TAG, "Presence parse failed");
65 - if(!response.payload || response.payload->type != PAYLOAD_TYPE_PRESENCE)
66 + if(!response->payload || response->payload->type != PAYLOAD_TYPE_PRESENCE)
68 OIC_LOG(ERROR, TAG, "Presence payload was wrong type");
69 result = OC_STACK_ERROR;
72 - response.sequenceNumber = ((OCPresencePayload*)response.payload)->sequenceNumber;
73 - resourceTypeName = ((OCPresencePayload*)response.payload)->resourceType;
74 - maxAge = ((OCPresencePayload*)response.payload)->maxAge;
75 + response->sequenceNumber = ((OCPresencePayload*)response->payload)->sequenceNumber;
76 + resourceTypeName = ((OCPresencePayload*)response->payload)->resourceType;
77 + maxAge = ((OCPresencePayload*)response->payload)->maxAge;
80 // check for unicast presence
81 @@ -1091,6 +1099,7 @@ OCStackResult HandlePresenceResponse(con
82 responseInfo->isMulticast);
83 if (uriLen < 0 || (size_t)uriLen >= sizeof (presenceUri))
86 return OC_STACK_INVALID_URI;
88 OIC_LOG(ERROR, TAG, "check for unicast presence");
89 @@ -1118,7 +1127,7 @@ OCStackResult HandlePresenceResponse(con
91 if (presenceSubscribe)
93 - if(cbNode->sequenceNumber == response.sequenceNumber)
94 + if(cbNode->sequenceNumber == response->sequenceNumber)
96 OIC_LOG(INFO, TAG, "No presence change");
97 ResetPresenceTTL(cbNode, maxAge);
98 @@ -1129,7 +1138,7 @@ OCStackResult HandlePresenceResponse(con
101 OIC_LOG(INFO, TAG, "Stopping presence");
102 - response.result = OC_STACK_PRESENCE_STOPPED;
103 + response->result = OC_STACK_PRESENCE_STOPPED;
106 OICFree(cbNode->presence->timeOut);
107 @@ -1165,7 +1174,7 @@ OCStackResult HandlePresenceResponse(con
109 ResetPresenceTTL(cbNode, maxAge);
111 - cbNode->sequenceNumber = response.sequenceNumber;
112 + cbNode->sequenceNumber = response->sequenceNumber;
116 @@ -1175,7 +1184,7 @@ OCStackResult HandlePresenceResponse(con
119 OIC_LOG(INFO, TAG, "Stopping presence");
120 - response.result = OC_STACK_PRESENCE_STOPPED;
121 + response->result = OC_STACK_PRESENCE_STOPPED;
125 @@ -1191,7 +1200,7 @@ OCStackResult HandlePresenceResponse(con
127 OIC_LOG(INFO, TAG, "Callback for presence");
129 - cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &response);
130 + cbResult = cbNode->callBack(cbNode->context, cbNode->handle, response);
132 if (cbResult == OC_STACK_DELETE_TRANSACTION)
134 @@ -1199,7 +1208,8 @@ OCStackResult HandlePresenceResponse(con
138 - OCPayloadDestroy(response.payload);
139 + OCPayloadDestroy(response->payload);
144 @@ -1240,36 +1250,53 @@ void OCHandleResponse(const CAEndpoint_t
145 OIC_LOG(INFO, TAG, "Receiving A Timeout for this token");
146 OIC_LOG(INFO, TAG, "Calling into application address space");
148 - OCClientResponse response =
149 - {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
150 - CopyEndpointToDevAddr(endPoint, &response.devAddr);
151 - FixUpClientResponse(&response);
152 - response.resourceUri = responseInfo->info.resourceUri;
153 - memcpy(response.identity.id, responseInfo->info.identity.id,
154 - sizeof (response.identity.id));
155 - response.identity.id_length = responseInfo->info.identity.id_length;
156 + OCClientResponse *response = NULL;
158 + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
161 + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
165 + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
166 + CopyEndpointToDevAddr(endPoint, &response->devAddr);
167 + FixUpClientResponse(response);
168 + response->resourceUri = responseInfo->info.resourceUri;
169 + memcpy(response->identity.id, responseInfo->info.identity.id,
170 + sizeof (response->identity.id));
171 + response->identity.id_length = responseInfo->info.identity.id_length;
173 - response.result = CAResponseToOCStackResult(responseInfo->result);
174 + response->result = CAResponseToOCStackResult(responseInfo->result);
175 cbNode->callBack(cbNode->context,
176 - cbNode->handle, &response);
177 + cbNode->handle, response);
178 FindAndDeleteClientCB(cbNode);
183 OIC_LOG(INFO, TAG, "This is a regular response, A client call back is found");
184 OIC_LOG(INFO, TAG, "Calling into application address space");
186 - OCClientResponse response =
187 - {.devAddr = {.adapter = OC_DEFAULT_ADAPTER}};
188 - response.sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
189 - CopyEndpointToDevAddr(endPoint, &response.devAddr);
190 - FixUpClientResponse(&response);
191 - response.resourceUri = responseInfo->info.resourceUri;
192 - memcpy(response.identity.id, responseInfo->info.identity.id,
193 - sizeof (response.identity.id));
194 - response.identity.id_length = responseInfo->info.identity.id_length;
195 + OCClientResponse *response = NULL;
197 - response.result = CAResponseToOCStackResult(responseInfo->result);
198 + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
201 + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
205 + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
206 + response->sequenceNumber = MAX_SEQUENCE_NUMBER + 1;
207 + CopyEndpointToDevAddr(endPoint, &response->devAddr);
208 + FixUpClientResponse(response);
209 + response->resourceUri = responseInfo->info.resourceUri;
210 + memcpy(response->identity.id, responseInfo->info.identity.id,
211 + sizeof (response->identity.id));
212 + response->identity.id_length = responseInfo->info.identity.id_length;
214 + response->result = CAResponseToOCStackResult(responseInfo->result);
216 if(responseInfo->info.payload &&
217 responseInfo->info.payloadSize)
218 @@ -1359,21 +1386,23 @@ void OCHandleResponse(const CAEndpoint_t
220 OIC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s",
221 cbNode->method, cbNode->requestUri);
226 - if(OC_STACK_OK != OCParsePayload(&response.payload,
227 + if(OC_STACK_OK != OCParsePayload(&response->payload,
229 responseInfo->info.payload,
230 responseInfo->info.payloadSize))
232 OIC_LOG(ERROR, TAG, "Error converting payload");
233 - OCPayloadDestroy(response.payload);
234 + OCPayloadDestroy(response->payload);
240 - response.numRcvdVendorSpecificHeaderOptions = 0;
241 + response->numRcvdVendorSpecificHeaderOptions = 0;
242 if(responseInfo->info.numOptions > 0)
245 @@ -1391,19 +1420,20 @@ void OCHandleResponse(const CAEndpoint_t
247 (observationOption << 8) | optionData[i];
249 - response.sequenceNumber = observationOption;
250 - response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
251 + response->sequenceNumber = observationOption;
252 + response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
257 - response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
258 + response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
261 - if(response.numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
262 + if(response->numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
264 OIC_LOG(ERROR, TAG, "#header options are more than MAX_HEADER_OPTIONS");
265 - OCPayloadDestroy(response.payload);
266 + OCPayloadDestroy(response->payload);
271 @@ -1411,19 +1441,19 @@ void OCHandleResponse(const CAEndpoint_t
273 if(&(responseInfo->info.options[i]))
275 - memcpy (&(response.rcvdVendorSpecificHeaderOptions[i-start]),
276 + memcpy (&(response->rcvdVendorSpecificHeaderOptions[i-start]),
277 &(responseInfo->info.options[i]), sizeof(OCHeaderOption));
282 if (cbNode->method == OC_REST_OBSERVE &&
283 - response.sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
284 + response->sequenceNumber > OC_OFFSET_SEQUENCE_NUMBER &&
285 cbNode->sequenceNumber <= MAX_SEQUENCE_NUMBER &&
286 - response.sequenceNumber <= cbNode->sequenceNumber)
287 + response->sequenceNumber <= cbNode->sequenceNumber)
289 OIC_LOG_V(INFO, TAG, "Received stale notification. Number :%d",
290 - response.sequenceNumber);
291 + response->sequenceNumber);
295 @@ -1432,13 +1462,13 @@ void OCHandleResponse(const CAEndpoint_t
296 char *targetUri = strstr(cbNode->requestUri, OC_RSRVD_RD_URI);
299 - OCUpdateResourceInsWithResponse(cbNode->requestUri, &response);
300 + OCUpdateResourceInsWithResponse(cbNode->requestUri, response);
303 OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context,
306 - cbNode->sequenceNumber = response.sequenceNumber;
308 + cbNode->sequenceNumber = response->sequenceNumber;
310 if (appFeedback == OC_STACK_DELETE_TRANSACTION)
312 @@ -1459,7 +1489,8 @@ void OCHandleResponse(const CAEndpoint_t
313 CA_MSG_ACKNOWLEDGE, 0, NULL, NULL, 0, NULL, CA_RESPONSE_FOR_RES);
316 - OCPayloadDestroy(response.payload);
317 + OCPayloadDestroy(response->payload);
322 @@ -1585,16 +1616,26 @@ void HandleCAErrorResponse(const CAEndpo
323 errorInfo->info.tokenLength, NULL, NULL);
326 - OCClientResponse response = { .devAddr = { .adapter = OC_DEFAULT_ADAPTER } };
327 - CopyEndpointToDevAddr(endPoint, &response.devAddr);
328 - FixUpClientResponse(&response);
329 - response.resourceUri = errorInfo->info.resourceUri;
330 - memcpy(response.identity.id, errorInfo->info.identity.id,
331 - sizeof (response.identity.id));
332 - response.identity.id_length = errorInfo->info.identity.id_length;
333 - response.result = CAResultToOCResult(errorInfo->result);
334 + OCClientResponse *response = NULL;
336 + response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
339 + OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
343 + response->devAddr.adapter = OC_DEFAULT_ADAPTER;
344 + CopyEndpointToDevAddr(endPoint, &response->devAddr);
345 + FixUpClientResponse(response);
346 + response->resourceUri = errorInfo->info.resourceUri;
347 + memcpy(response->identity.id, errorInfo->info.identity.id,
348 + sizeof (response->identity.id));
349 + response->identity.id_length = errorInfo->info.identity.id_length;
350 + response->result = CAResultToOCResult(errorInfo->result);
352 - cbNode->callBack(cbNode->context, cbNode->handle, &response);
353 + cbNode->callBack(cbNode->context, cbNode->handle, response);
357 ResourceObserver *observer = GetObserverUsingToken(errorInfo->info.token,