]> granicus.if.org Git - esp-idf/commitdiff
esp_event: fix possible malloc free issues found by static analyzer
authorDavid Cermak <cermak@espressif.com>
Fri, 31 May 2019 09:23:02 +0000 (11:23 +0200)
committerbot <bot@espressif.com>
Mon, 7 Oct 2019 19:19:23 +0000 (19:19 +0000)
(v3.3)

Backport of bd537083d92fc8881d62a48eeacb178bdfb4bdc7

components/esp_event/esp_event.c

index d9f65c4a2f4b44ade0eb16f17db73d2fa7233d38..99df37ce056656e3a50683d8b186505611be4620 100644 (file)
@@ -195,7 +195,7 @@ static esp_err_t base_node_add_handler(esp_event_base_node_t* base_node, int32_t
             id_node = (esp_event_id_node_t*) calloc(1, sizeof(*id_node));
 
             if (!id_node) {
-                ESP_LOGI(TAG, "alloc for new id node failed");
+                ESP_LOGE(TAG, "alloc for new id node failed");
                 return ESP_ERR_NO_MEM;
             }
 
@@ -212,6 +212,8 @@ static esp_err_t base_node_add_handler(esp_event_base_node_t* base_node, int32_t
                 else {
                     SLIST_INSERT_AFTER(last_id_node, id_node, next);
                 }
+            } else {
+                free(id_node);
             }
 
             return err;
@@ -263,6 +265,8 @@ static esp_err_t loop_node_add_handler(esp_event_loop_node_t* loop_node, esp_eve
                 else {
                     SLIST_INSERT_AFTER(last_base_node, base_node, next);
                 }
+            } else {
+                free(base_node);
             }
 
             return err;
@@ -413,7 +417,7 @@ esp_err_t esp_event_loop_create(const esp_event_loop_args_t* event_loop_args, es
     loop = calloc(1, sizeof(*loop));
     if (loop == NULL) {
         ESP_LOGE(TAG, "alloc for event loop failed");
-        goto on_err;
+        return err;
     }
 
     loop->queue = xQueueCreate(event_loop_args->queue_size , sizeof(esp_event_post_instance_t));
@@ -688,6 +692,8 @@ esp_err_t esp_event_handler_register_with(esp_event_loop_handle_t event_loop, es
             else {
                 SLIST_INSERT_AFTER(last_loop_node, loop_node, next);
             }
+        } else {
+            free(loop_node);
         }
     }
     else {