From 4881a2aca071ae17f004b47cafc257cd4b862f2d Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Tue, 12 Mar 2024 14:45:55 +0800 Subject: [PATCH] fix(jpeg): Fix memory leak on jpeg decoder --- components/esp_driver_jpeg/jpeg_common.c | 4 +++- components/esp_driver_jpeg/jpeg_decode.c | 3 +++ .../test_apps/jpeg_test_apps/main/test_jpeg_decode.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/components/esp_driver_jpeg/jpeg_common.c b/components/esp_driver_jpeg/jpeg_common.c index b699fae11f..28207536f7 100644 --- a/components/esp_driver_jpeg/jpeg_common.c +++ b/components/esp_driver_jpeg/jpeg_common.c @@ -169,7 +169,9 @@ esp_err_t jpeg_isr_deregister(jpeg_codec_handle_t jpeg_codec, jpeg_isr_handler_t break; } prev = it; - free(prev); + } + if (found) { + free(it); } if (unlikely(found != true)) { return ESP_ERR_INVALID_STATE; diff --git a/components/esp_driver_jpeg/jpeg_decode.c b/components/esp_driver_jpeg/jpeg_decode.c index f72225aadb..991cf11f5d 100644 --- a/components/esp_driver_jpeg/jpeg_decode.c +++ b/components/esp_driver_jpeg/jpeg_decode.c @@ -263,6 +263,9 @@ esp_err_t jpeg_del_decoder_engine(jpeg_decoder_handle_t decoder_engine) if (decoder_engine->header_info) { free(decoder_engine->header_info); } + if (decoder_engine->trans_desc) { + free(decoder_engine->trans_desc); + } if (decoder_engine->evt_queue) { vQueueDeleteWithCaps(decoder_engine->evt_queue); } diff --git a/components/esp_driver_jpeg/test_apps/jpeg_test_apps/main/test_jpeg_decode.c b/components/esp_driver_jpeg/test_apps/jpeg_test_apps/main/test_jpeg_decode.c index 78dfa06ad8..74d62a2912 100644 --- a/components/esp_driver_jpeg/test_apps/jpeg_test_apps/main/test_jpeg_decode.c +++ b/components/esp_driver_jpeg/test_apps/jpeg_test_apps/main/test_jpeg_decode.c @@ -30,7 +30,7 @@ TEST_CASE("JPEG decode driver memory leaking check", "[jpeg]") }; int size = esp_get_free_heap_size(); - for (uint32_t i = 0; i <= 3; i++) { + for (uint32_t i = 0; i <= 10; i++) { TEST_ESP_OK(jpeg_new_decoder_engine(&decode_eng_cfg, &jpgd_handle)); vTaskDelay(10 / portTICK_PERIOD_MS); TEST_ESP_OK(jpeg_del_decoder_engine(jpgd_handle));