From a7a43c9b758bd8d0aa21fe75f0026f01c2edf920 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 26 Jun 2025 08:09:54 -0400 Subject: [PATCH] MT#55283 fix mem leak SDP attributes have been moved to the call's memory arena in 5115fe000. Make sure the redis restore code uses the same. Remove some redundant null checks as well. Closes #1959 Change-Id: I2f37869f5f2c95999d028c811c6a0eb10215f576 --- daemon/call.c | 9 +++------ daemon/redis.c | 27 +++++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index b57d12560..d8dfe15b7 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2755,8 +2755,7 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c /* origin (name, version etc.) */ if (flags->session_sdp_orig.parsed) { - if (ml->session_sdp_orig) - sdp_orig_free(ml->session_sdp_orig); + sdp_orig_free(ml->session_sdp_orig); ml->session_sdp_orig = sdp_orig_dup(&flags->session_sdp_orig); } @@ -4318,10 +4317,8 @@ void __monologue_free(struct call_monologue *m) { t_hash_table_destroy(m->media_ids); if (m->last_out_sdp) g_string_free(m->last_out_sdp, TRUE); - if (m->session_sdp_orig) - sdp_orig_free(m->session_sdp_orig); - if (m->session_last_sdp_orig) - sdp_orig_free(m->session_last_sdp_orig); + sdp_orig_free(m->session_sdp_orig); + sdp_orig_free(m->session_last_sdp_orig); t_queue_clear_full(&m->generic_attributes, sdp_attr_free); t_queue_clear_full(&m->all_attributes, sdp_attr_free); t_queue_clear(&m->tag_aliases); diff --git a/daemon/redis.c b/daemon/redis.c index e1e3b94c3..f40399280 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -32,6 +32,7 @@ #include "ssrc.h" #include "main.h" #include "codec.h" +#include "sdp.h" typedef union { GQueue *q; @@ -1517,39 +1518,41 @@ static int redis_tags(call_t *c, struct redis_list *tags, parser_arg arg) { ml->sdp_session_timing = call_str_cpy(&s); /* o= */ if (!redis_hash_get_str(&s, rh, "sdp_orig_parsed")) { + sdp_orig_free(ml->session_sdp_orig); ml->session_sdp_orig = g_new0(__typeof(*ml->session_sdp_orig), 1); ml->session_sdp_orig->parsed = 1; redis_hash_get_llu(&ml->session_sdp_orig->version_num, rh, "sdp_orig_version_num"); if (!redis_hash_get_str(&s, rh, "sdp_orig_username")) - ml->session_sdp_orig->username = str_dup_str(&s); + ml->session_sdp_orig->username = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_session_id")) - ml->session_sdp_orig->session_id = str_dup_str(&s); + ml->session_sdp_orig->session_id = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_version_str")) - ml->session_sdp_orig->version_str = str_dup_str(&s); + ml->session_sdp_orig->version_str = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_network_type")) - ml->session_sdp_orig->address.network_type = str_dup_str(&s); + ml->session_sdp_orig->address.network_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_address_type")) - ml->session_sdp_orig->address.address_type = str_dup_str(&s); + ml->session_sdp_orig->address.address_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "sdp_orig_address_address")) - ml->session_sdp_orig->address.address = str_dup_str(&s); + ml->session_sdp_orig->address.address = call_str_cpy(&s); } /* o= last used of the other side*/ if (!redis_hash_get_str(&s, rh, "last_sdp_orig_parsed")) { + sdp_orig_free(ml->session_last_sdp_orig); ml->session_last_sdp_orig = g_new0(__typeof(*ml->session_last_sdp_orig), 1); ml->session_last_sdp_orig->parsed = 1; redis_hash_get_llu(&ml->session_last_sdp_orig->version_num, rh, "last_sdp_orig_version_num"); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_username")) - ml->session_last_sdp_orig->username = str_dup_str(&s); + ml->session_last_sdp_orig->username = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_session_id")) - ml->session_last_sdp_orig->session_id = str_dup_str(&s); + ml->session_last_sdp_orig->session_id = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_version_str")) - ml->session_last_sdp_orig->version_str = str_dup_str(&s); + ml->session_last_sdp_orig->version_str = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_network_type")) - ml->session_last_sdp_orig->address.network_type = str_dup_str(&s); + ml->session_last_sdp_orig->address.network_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_address_type")) - ml->session_last_sdp_orig->address.address_type = str_dup_str(&s); + ml->session_last_sdp_orig->address.address_type = call_str_cpy(&s); if (!redis_hash_get_str(&s, rh, "last_sdp_orig_address_address")) - ml->session_last_sdp_orig->address.address = str_dup_str(&s); + ml->session_last_sdp_orig->address.address = call_str_cpy(&s); } ml->sdp_session_bandwidth.as = (!redis_hash_get_ld(&il, rh, "sdp_session_as")) ? il : -1;