From f5ffd53aeb402afc1333a98168bb2fa35d7cdc77 Mon Sep 17 00:00:00 2001 From: caffreyfans Date: Fri, 17 Dec 2021 16:05:38 +0800 Subject: [PATCH 1/3] Fix mDNS memory leak --- components/mdns/mdns.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 988a15fc40..f0963802e0 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -2296,6 +2296,7 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * if (hostname) { s->hostname = strndup(hostname, MDNS_NAME_BUF_LEN - 1); if (!s->hostname) { + free((char *)s->instance); free(s); return NULL; } @@ -2305,12 +2306,14 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * s->service = strndup(service, MDNS_NAME_BUF_LEN - 1); if (!s->service) { + free((char *)s->instance); free(s); return NULL; } s->proto = strndup(proto, MDNS_NAME_BUF_LEN - 1); if (!s->proto) { + free((char *)s->instance); free((char *)s->service); free(s); return NULL; From 119b4a9dd12cf89cc5eaf63f8aa19730607ef30b Mon Sep 17 00:00:00 2001 From: caffreyfans Date: Fri, 17 Dec 2021 16:21:21 +0800 Subject: [PATCH 2/3] Fix mDNS memory leak --- components/mdns/mdns.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index f0963802e0..1c7662eb9a 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -2296,9 +2296,7 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * if (hostname) { s->hostname = strndup(hostname, MDNS_NAME_BUF_LEN - 1); if (!s->hostname) { - free((char *)s->instance); - free(s); - return NULL; + goto fail; } } else { s->hostname = NULL; @@ -2306,20 +2304,27 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * s->service = strndup(service, MDNS_NAME_BUF_LEN - 1); if (!s->service) { - free((char *)s->instance); - free(s); - return NULL; + goto fail; } s->proto = strndup(proto, MDNS_NAME_BUF_LEN - 1); if (!s->proto) { - free((char *)s->instance); free((char *)s->service); - free(s); - return NULL; + goto fail; } return s; + +fail: + if (s->instance) { + free(s->instance); + } + if (s->hostname) { + free(s->hostname); + } + free(s); + + return NULL; } /** From fad62cc1ed3dce63b58297172a72a489d7af2d9d Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 17 Jan 2022 08:31:16 +0100 Subject: [PATCH 3/3] mdns: Fix minor memory leaks when creating services --- components/mdns/mdns.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 1c7662eb9a..0da49888dd 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -2247,6 +2247,11 @@ static mdns_txt_linked_item_t * _mdns_allocate_txt(size_t num_items, mdns_txt_it } return new_txt; } + +/** + * @brief Deallocate the txt linked list + * @param txt pointer to the txt pointer to free, noop if txt==NULL + */ static void _mdns_free_linked_txt(mdns_txt_linked_item_t *txt) { mdns_txt_linked_item_t *t; @@ -2274,7 +2279,7 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * uint16_t port, const char * instance, size_t num_items, mdns_txt_item_t txt[]) { - mdns_service_t * s = (mdns_service_t *)malloc(sizeof(mdns_service_t)); + mdns_service_t * s = (mdns_service_t *)calloc(1, sizeof(mdns_service_t)); if (!s) { HOOK_MALLOC_FAILED; return NULL; @@ -2282,8 +2287,7 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * mdns_txt_linked_item_t * new_txt = _mdns_allocate_txt(num_items, txt); if (num_items && new_txt == NULL) { - free(s); - return NULL; + goto fail; } s->priority = 0; @@ -2309,19 +2313,16 @@ static mdns_service_t * _mdns_create_service(const char * service, const char * s->proto = strndup(proto, MDNS_NAME_BUF_LEN - 1); if (!s->proto) { - free((char *)s->service); goto fail; } - return s; fail: - if (s->instance) { - free(s->instance); - } - if (s->hostname) { - free(s->hostname); - } + _mdns_free_linked_txt(s->txt); + free((char *)s->instance); + free((char *)s->service); + free((char *)s->proto); + free((char *)s->hostname); free(s); return NULL;