Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 684e9da

Browse files
authored
Fix a bug causing multi-heap assert exception in modcoap and improve modcoap's memory handling (#208)
The following is fixed: * Incorrectly called "free" on the "path" pointer, "path" pointer did not point to the correct memory area when free() was called * Changed m_malloc and m_free to malloc and free because those objects not needed to be allocated on the Garbage Collector controlled heap * Removed the "uri" member of "resource" object because it was not used
1 parent 826e233 commit 684e9da

File tree

1 file changed

+20
-23
lines changed

1 file changed

+20
-23
lines changed

esp32/mods/modcoap.c

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ typedef struct mod_coap_resource_obj_s {
4343
coap_resource_t* coap_resource;
4444
struct mod_coap_resource_obj_s* next;
4545
uint8_t* value;
46-
unsigned char* uri;
4746
uint32_t max_age;
4847
uint16_t etag_value;
4948
uint16_t value_len;
@@ -208,9 +207,10 @@ STATIC mod_coap_resource_obj_t* add_resource(const char* uri, uint8_t mediatype,
208207
resource->next = NULL;
209208

210209
// uri parameter pointer will be destroyed, pass a pointer to a permanent location
211-
resource->uri = m_malloc(strlen(uri));
212-
memcpy(resource->uri, uri, strlen(uri));
213-
resource->coap_resource = coap_resource_init((const unsigned char* )resource->uri, strlen(uri), 0);
210+
unsigned char* uri_ptr = (unsigned char*)malloc(strlen(uri));
211+
memcpy(uri_ptr, uri, strlen(uri));
212+
// Pass COAP_RESOURCE_FLAGS_RELEASE_URI so Coap Library will free up the memory allocated to store the URI when the Resource is deleted
213+
resource->coap_resource = coap_resource_init(uri_ptr, strlen(uri), COAP_RESOURCE_FLAGS_RELEASE_URI);
214214
if(resource->coap_resource != NULL) {
215215
// Add the resource to the Coap context
216216
coap_add_resource(context->context, resource->coap_resource);
@@ -238,7 +238,7 @@ STATIC mod_coap_resource_obj_t* add_resource(const char* uri, uint8_t mediatype,
238238
return resource;
239239
}
240240
else {
241-
m_free(resource->uri);
241+
free(uri_ptr);
242242
m_del_obj(mod_coap_resource_obj_t, resource);
243243
// Resource cannot be created
244244
return NULL;
@@ -278,14 +278,12 @@ STATIC void remove_resource_by_key(coap_key_t key) {
278278
previous->next = current->next;
279279
}
280280

281-
// Free the URI
282-
m_free(current->uri);
283281
// Free the resource in coap's scope
284282
coap_delete_resource(context->context, key);
285283
// Free the element in MP scope
286-
m_free(current->value);
284+
free(current->value);
287285
// Free the resource itself
288-
m_free(current);
286+
m_del_obj(mod_coap_resource_obj_t, current);
289287

290288
return;
291289
}
@@ -320,7 +318,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne
320318

321319
// Invalidate current data first
322320
resource->value_len = 0;
323-
m_free(resource->value);
321+
free(resource->value);
324322

325323
if (mp_obj_is_integer(new_value)) {
326324

@@ -334,7 +332,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne
334332
}
335333

336334
// Allocate memory for the new data
337-
resource->value = m_malloc(resource->value_len);
335+
resource->value = malloc(resource->value_len);
338336
memcpy(resource->value, &value, sizeof(value));
339337

340338
} else {
@@ -344,7 +342,7 @@ STATIC void resource_update_value(mod_coap_resource_obj_t* resource, mp_obj_t ne
344342
resource->value_len = value_bufinfo.len;
345343

346344
// Allocate memory for the new data
347-
resource->value = m_malloc(resource->value_len);
345+
resource->value = malloc(resource->value_len);
348346
memcpy(resource->value, value_bufinfo.buf, resource->value_len);
349347
}
350348
}
@@ -748,16 +746,13 @@ STATIC coap_pdu_t * modcoap_new_request
748746
// Helper function to create a new option for a request message
749747
STATIC coap_list_t * modcoap_new_option_node(unsigned short key, unsigned int length, unsigned char *data) {
750748

751-
coap_list_t *node = m_malloc(sizeof(coap_list_t) + sizeof(coap_option) + length);
749+
coap_list_t *node = malloc(sizeof(coap_list_t) + sizeof(coap_option) + length);
752750
if (node) {
753751
coap_option *option;
754752
option = (coap_option *)(node->data);
755753
COAP_OPTION_KEY(*option) = key;
756754
COAP_OPTION_LENGTH(*option) = length;
757755
memcpy(COAP_OPTION_DATA(*option), data, length);
758-
} else {
759-
m_free(node);
760-
node = NULL;
761756
}
762757

763758
return node;
@@ -937,7 +932,7 @@ STATIC mp_obj_t mod_coap_init(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map
937932
// Only 1 context is supported currently
938933
if(initialized == false) {
939934

940-
MP_STATE_PORT(coap_ptr) = m_malloc(sizeof(mod_coap_obj_t));
935+
MP_STATE_PORT(coap_ptr) = m_new_obj(mod_coap_obj_t);
941936
coap_obj_ptr = MP_STATE_PORT(coap_ptr);
942937
coap_obj_ptr->context = NULL;
943938
coap_obj_ptr->resources = NULL;
@@ -1235,19 +1230,21 @@ STATIC mp_obj_t mod_coap_send_request(mp_uint_t n_args, const mp_obj_t *pos_args
12351230
//TODO: allocate the proper length
12361231
size_t length = 300;
12371232
unsigned char* path = malloc(length);
1238-
int segments = coap_split_path(coap_uri.path.s, coap_uri.path.length, path, &length);
1233+
// Need to use a different pointer because when the segments are composed the pointer itself is moved
1234+
unsigned char* path_segment = path;
1235+
int segments = coap_split_path(coap_uri.path.s, coap_uri.path.length, path_segment, &length);
12391236

12401237
// Insert the segments as separate URI-Path options
12411238
while (segments--) {
1242-
node = modcoap_new_option_node(COAP_OPTION_URI_PATH, COAP_OPT_LENGTH(path), COAP_OPT_VALUE(path));
1239+
node = modcoap_new_option_node(COAP_OPTION_URI_PATH, COAP_OPT_LENGTH(path_segment), COAP_OPT_VALUE(path_segment));
12431240
if(node != NULL) {
12441241
LL_APPEND(coap_obj_ptr->optlist, node);
12451242
}
1246-
1247-
path += COAP_OPT_SIZE(path);
1243+
// Move the path_segment pointer to the next segment
1244+
path_segment += COAP_OPT_SIZE(path_segment);
12481245
}
12491246

1250-
1247+
// Free up the memory using the pointer pointing to the beginning of the memory area
12511248
free(path);
12521249

12531250
// Put Content Format option if given
@@ -1271,7 +1268,7 @@ STATIC mp_obj_t mod_coap_send_request(mp_uint_t n_args, const mp_obj_t *pos_args
12711268
while(coap_obj_ptr->optlist != NULL) {
12721269
next = coap_obj_ptr->optlist->next;
12731270
coap_obj_ptr->optlist->next = NULL;
1274-
m_free(coap_obj_ptr->optlist);
1271+
free(coap_obj_ptr->optlist);
12751272
coap_obj_ptr->optlist = next;
12761273
}
12771274

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy