Commit based upon d6442850bde61f0c3e7e2ae3247b4a856073c5e0
[librecmc/package-feed.git] / net / iotivity / patches / 051-csdk-move-OCClientResponse-from-stack-to-heap.patch
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
5
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.
10
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
14
15 Change-Id: I45d8aee4a8151fea51d3318acb1eea61ce579060
16 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
17 ---
18  resource/csdk/stack/src/ocstack.c | 163 ++++++++++++++++++++++++--------------
19  1 file changed, 102 insertions(+), 61 deletions(-)
20
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;
30      uint32_t maxAge = 0;
31      int uriLen;
32 @@ -1057,15 +1057,23 @@ OCStackResult HandlePresenceResponse(con
33          return OC_STACK_ERROR;
34      }
35  
36 -    response.payload = NULL;
37 -    response.result = OC_STACK_OK;
38 +    response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
39 +    if (!response)
40 +    {
41 +            OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
42 +            return OC_STACK_ERROR;
43 +    }
44 +    response->devAddr.adapter = OC_DEFAULT_ADAPTER;
45  
46 -    CopyEndpointToDevAddr(endpoint, &response.devAddr);
47 -    FixUpClientResponse(&response);
48 +    response->payload = NULL;
49 +    response->result = OC_STACK_OK;
50 +
51 +    CopyEndpointToDevAddr(endpoint, &response->devAddr);
52 +    FixUpClientResponse(response);
53  
54      if (responseInfo->info.payload)
55      {
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");
63              goto exit;
64          }
65 -        if(!response.payload || response.payload->type != PAYLOAD_TYPE_PRESENCE)
66 +        if(!response->payload || response->payload->type != PAYLOAD_TYPE_PRESENCE)
67          {
68              OIC_LOG(ERROR, TAG, "Presence payload was wrong type");
69              result = OC_STACK_ERROR;
70              goto exit;
71          }
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;
78      }
79  
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))
84      {
85 +        OICFree(response);
86          return OC_STACK_INVALID_URI;
87      }
88      OIC_LOG(ERROR, TAG, "check for unicast presence");
89 @@ -1118,7 +1127,7 @@ OCStackResult HandlePresenceResponse(con
90  
91      if (presenceSubscribe)
92      {
93 -        if(cbNode->sequenceNumber == response.sequenceNumber)
94 +        if(cbNode->sequenceNumber == response->sequenceNumber)
95          {
96              OIC_LOG(INFO, TAG, "No presence change");
97              ResetPresenceTTL(cbNode, maxAge);
98 @@ -1129,7 +1138,7 @@ OCStackResult HandlePresenceResponse(con
99          if(maxAge == 0)
100          {
101              OIC_LOG(INFO, TAG, "Stopping presence");
102 -            response.result = OC_STACK_PRESENCE_STOPPED;
103 +            response->result = OC_STACK_PRESENCE_STOPPED;
104              if(cbNode->presence)
105              {
106                  OICFree(cbNode->presence->timeOut);
107 @@ -1165,7 +1174,7 @@ OCStackResult HandlePresenceResponse(con
108  
109              ResetPresenceTTL(cbNode, maxAge);
110  
111 -            cbNode->sequenceNumber = response.sequenceNumber;
112 +            cbNode->sequenceNumber = response->sequenceNumber;
113          }
114      }
115      else
116 @@ -1175,7 +1184,7 @@ OCStackResult HandlePresenceResponse(con
117          if (0 == maxAge)
118          {
119              OIC_LOG(INFO, TAG, "Stopping presence");
120 -            response.result = OC_STACK_PRESENCE_STOPPED;
121 +            response->result = OC_STACK_PRESENCE_STOPPED;
122          }
123      }
124  
125 @@ -1191,7 +1200,7 @@ OCStackResult HandlePresenceResponse(con
126  
127      OIC_LOG(INFO, TAG, "Callback for presence");
128  
129 -    cbResult = cbNode->callBack(cbNode->context, cbNode->handle, &response);
130 +    cbResult = cbNode->callBack(cbNode->context, cbNode->handle, response);
131  
132      if (cbResult == OC_STACK_DELETE_TRANSACTION)
133      {
134 @@ -1199,7 +1208,8 @@ OCStackResult HandlePresenceResponse(con
135      }
136  
137  exit:
138 -    OCPayloadDestroy(response.payload);
139 +    OCPayloadDestroy(response->payload);
140 +    OICFree(response);
141      return result;
142  }
143  
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");
147  
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;
157 +
158 +            response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
159 +            if (!response)
160 +            {
161 +                OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
162 +                return;
163 +            }
164 +
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;
172  
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);
179 +            OICFree(response);
180          }
181          else
182          {
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");
185  
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;
196  
197 -            response.result = CAResponseToOCStackResult(responseInfo->result);
198 +            response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
199 +            if (!response)
200 +            {
201 +                OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
202 +                return;
203 +            }
204 +            
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;
213 +
214 +            response->result = CAResponseToOCStackResult(responseInfo->result);
215  
216              if(responseInfo->info.payload &&
217                 responseInfo->info.payloadSize)
218 @@ -1359,21 +1386,23 @@ void OCHandleResponse(const CAEndpoint_t
219                  {
220                      OIC_LOG_V(ERROR, TAG, "Unknown Payload type: %d %s",
221                              cbNode->method, cbNode->requestUri);
222 +                    OICFree(response);
223                      return;
224                  }
225  
226 -                if(OC_STACK_OK != OCParsePayload(&response.payload,
227 +                if(OC_STACK_OK != OCParsePayload(&response->payload,
228                              type,
229                              responseInfo->info.payload,
230                              responseInfo->info.payloadSize))
231                  {
232                      OIC_LOG(ERROR, TAG, "Error converting payload");
233 -                    OCPayloadDestroy(response.payload);
234 +                    OCPayloadDestroy(response->payload);
235 +                    OICFree(response);
236                      return;
237                  }
238              }
239  
240 -            response.numRcvdVendorSpecificHeaderOptions = 0;
241 +            response->numRcvdVendorSpecificHeaderOptions = 0;
242              if(responseInfo->info.numOptions > 0)
243              {
244                  int start = 0;
245 @@ -1391,19 +1420,20 @@ void OCHandleResponse(const CAEndpoint_t
246                          observationOption =
247                              (observationOption << 8) | optionData[i];
248                      }
249 -                    response.sequenceNumber = observationOption;
250 -                    response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
251 +                    response->sequenceNumber = observationOption;
252 +                    response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions - 1;
253                      start = 1;
254                  }
255                  else
256                  {
257 -                    response.numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
258 +                    response->numRcvdVendorSpecificHeaderOptions = responseInfo->info.numOptions;
259                  }
260  
261 -                if(response.numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
262 +                if(response->numRcvdVendorSpecificHeaderOptions > MAX_HEADER_OPTIONS)
263                  {
264                      OIC_LOG(ERROR, TAG, "#header options are more than MAX_HEADER_OPTIONS");
265 -                    OCPayloadDestroy(response.payload);
266 +                    OCPayloadDestroy(response->payload);
267 +                    OICFree(response);
268                      return;
269                  }
270  
271 @@ -1411,19 +1441,19 @@ void OCHandleResponse(const CAEndpoint_t
272                  {
273                      if(&(responseInfo->info.options[i]))
274                      {
275 -                        memcpy (&(response.rcvdVendorSpecificHeaderOptions[i-start]),
276 +                        memcpy (&(response->rcvdVendorSpecificHeaderOptions[i-start]),
277                                  &(responseInfo->info.options[i]), sizeof(OCHeaderOption));
278                      }
279                  }
280              }
281  
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)
288              {
289                  OIC_LOG_V(INFO, TAG, "Received stale notification. Number :%d",
290 -                                                 response.sequenceNumber);
291 +                                                 response->sequenceNumber);
292              }
293              else
294              {
295 @@ -1432,13 +1462,13 @@ void OCHandleResponse(const CAEndpoint_t
296                  char *targetUri = strstr(cbNode->requestUri, OC_RSRVD_RD_URI);
297                  if (targetUri)
298                  {
299 -                    OCUpdateResourceInsWithResponse(cbNode->requestUri, &response);
300 +                    OCUpdateResourceInsWithResponse(cbNode->requestUri, response);
301                  }
302  #endif
303                  OCStackApplicationResult appFeedback = cbNode->callBack(cbNode->context,
304                                                                          cbNode->handle,
305 -                                                                        &response);
306 -                cbNode->sequenceNumber = response.sequenceNumber;
307 +                                                                        response);
308 +                cbNode->sequenceNumber = response->sequenceNumber;
309  
310                  if (appFeedback == OC_STACK_DELETE_TRANSACTION)
311                  {
312 @@ -1459,7 +1489,8 @@ void OCHandleResponse(const CAEndpoint_t
313                          CA_MSG_ACKNOWLEDGE, 0, NULL, NULL, 0, NULL, CA_RESPONSE_FOR_RES);
314              }
315  
316 -            OCPayloadDestroy(response.payload);
317 +            OCPayloadDestroy(response->payload);
318 +            OICFree(response);
319          }
320          return;
321      }
322 @@ -1585,16 +1616,26 @@ void HandleCAErrorResponse(const CAEndpo
323                                     errorInfo->info.tokenLength, NULL, NULL);
324      if (cbNode)
325      {
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;
335 +
336 +        response = (OCClientResponse *)OICCalloc(1, sizeof(*response));
337 +        if (!response)
338 +        {
339 +            OIC_LOG(ERROR, TAG, "Allocating memory for response failed");
340 +            return;
341 +        }
342 +
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);
351  
352 -        cbNode->callBack(cbNode->context, cbNode->handle, &response);
353 +        cbNode->callBack(cbNode->context, cbNode->handle, response);
354 +        OICFree(response);
355      }
356  
357      ResourceObserver *observer = GetObserverUsingToken(errorInfo->info.token,