From 8dd27183f8052042a9063fa7379517ccd2eff0b0 Mon Sep 17 00:00:00 2001 From: Andrey Volk Date: Sun, 16 Feb 2020 00:29:38 +0400 Subject: [PATCH] [Core] Fix possible leak of the subclass variable in CUSTOM_HASH'es switch_event_reserve_subclass_detailed(). --- src/include/switch_utils.h | 6 ++++++ src/switch_event.c | 8 +++++++- src/switch_utils.c | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 5ff584bd0c..1c40975908 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -1338,6 +1338,12 @@ SWITCH_DECLARE(void) switch_split_time(const char *exp, int *hour, int *min, int */ SWITCH_DECLARE(int) switch_split_user_domain(char *in, char **user, char **domain); +SWITCH_DECLARE(void *) switch_calloc(size_t nmemb, size_t size); + +#ifdef __clang_analyzer__ +#define calloc switch_calloc +#endif + /* malloc or DIE macros */ #ifdef NDEBUG #define switch_malloc(ptr, len) (void)( (!!(ptr = malloc(len))) || (fprintf(stderr,"ABORT! Malloc failure at: %s:%d", __FILE__, __LINE__),abort(), 0), ptr ) diff --git a/src/switch_event.c b/src/switch_event.c index 91e07c6b79..a29ac78858 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -503,7 +503,13 @@ SWITCH_DECLARE(switch_status_t) switch_event_reserve_subclass_detailed(const cha subclass->owner = DUP(owner); subclass->name = DUP(subclass_name); - switch_core_hash_insert(CUSTOM_HASH, subclass->name, subclass); + status = switch_core_hash_insert(CUSTOM_HASH, subclass->name, subclass); + + if (status != SWITCH_STATUS_SUCCESS) { + free(subclass->owner); + free(subclass->name); + free(subclass); + } end: diff --git a/src/switch_utils.c b/src/switch_utils.c index 2e249d6593..e6e4917b1e 100644 --- a/src/switch_utils.c +++ b/src/switch_utils.c @@ -71,6 +71,11 @@ struct switch_network_list { char *name; }; +SWITCH_DECLARE(void *) switch_calloc(size_t nmemb, size_t size) +{ + return calloc(nmemb, size); +} + #ifndef WIN32 SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst) {