051-csdk-move-OCClientResponse-from-stack-to-heap.patch (15920B)
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,