From de49ec5a46545649b932970f2a1f42bd95b535ec Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 1/4] Fix memory leak on error path in esp_ds_start_sign --- components/esp32s2/esp_ds.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp32s2/esp_ds.c b/components/esp32s2/esp_ds.c index f7e2b9564d..635e83e2a2 100644 --- a/components/esp32s2/esp_ds.c +++ b/components/esp32s2/esp_ds.c @@ -129,6 +129,7 @@ esp_err_t esp_ds_start_sign(const void *message, if (result == ETS_DS_INVALID_KEY) { ds_disable_release(); + free(context); return ESP_ERR_HW_CRYPTO_DS_INVALID_KEY; } From e634a00ef8d51c7c63b6fac10b47ca1ef38f434c Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 2/4] Fix memory leak on error path in md5_printf --- components/esp_http_client/lib/http_auth.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp_http_client/lib/http_auth.c b/components/esp_http_client/lib/http_auth.c index 0eb19651f4..248608782c 100644 --- a/components/esp_http_client/lib/http_auth.c +++ b/components/esp_http_client/lib/http_auth.c @@ -51,6 +51,7 @@ static int md5_printf(char *md, const char *fmt, ...) va_start(ap, fmt); len = vasprintf((char **)&buf, fmt, ap); if (buf == NULL) { + va_end(ap); return ESP_FAIL; } From afd3fc6d16fdc6bf4ae99c1c3829f967fb17290a Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 3/4] Fix memory leak on error path in http_header_set_format --- components/esp_http_client/lib/http_header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_http_client/lib/http_header.c b/components/esp_http_client/lib/http_header.c index b24ce6b46d..f8904e7207 100644 --- a/components/esp_http_client/lib/http_header.c +++ b/components/esp_http_client/lib/http_header.c @@ -162,8 +162,8 @@ int http_header_set_format(http_header_handle_t header, const char *key, const c char *buf = NULL; va_start(argptr, format); len = vasprintf(&buf, format, argptr); - HTTP_MEM_CHECK(TAG, buf, return 0); va_end(argptr); + HTTP_MEM_CHECK(TAG, buf, return 0); if (buf == NULL) { return 0; } From 0cb48f2f2e59a4df5745b84b887f2dd3367a8bd0 Mon Sep 17 00:00:00 2001 From: Alex Henrie Date: Tue, 20 Jul 2021 13:52:53 -0600 Subject: [PATCH 4/4] Fix memory leak on error path in register_select And remove dead error handling code from unregister_select. Closes https://github.com/espressif/esp-idf/pull/7296 --- components/vfs/vfs_uart.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/components/vfs/vfs_uart.c b/components/vfs/vfs_uart.c index 1d843b47fc..ffd864506e 100644 --- a/components/vfs/vfs_uart.c +++ b/components/vfs/vfs_uart.c @@ -363,9 +363,11 @@ static esp_err_t register_select(uart_select_args_t *args) if (args) { portENTER_CRITICAL(&s_registered_select_lock); const int new_size = s_registered_select_num + 1; - if ((s_registered_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *))) == NULL) { + uart_select_args_t **new_selects; + if ((new_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *))) == NULL) { ret = ESP_ERR_NO_MEM; } else { + s_registered_selects = new_selects; s_registered_selects[s_registered_select_num] = args; s_registered_select_num = new_size; ret = ESP_OK; @@ -389,12 +391,9 @@ static esp_err_t unregister_select(uart_select_args_t *args) // last item. s_registered_selects[i] = s_registered_selects[new_size]; s_registered_selects = realloc(s_registered_selects, new_size * sizeof(uart_select_args_t *)); - if (s_registered_selects || new_size == 0) { - s_registered_select_num = new_size; - ret = ESP_OK; - } else { - ret = ESP_ERR_NO_MEM; - } + // Shrinking a buffer with realloc is guaranteed to succeed. + s_registered_select_num = new_size; + ret = ESP_OK; break; } }