From 9aef7cc068ea19dce2c8fc2bdfd5ac1174414e03 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 (cherry picked from commit a7a43c9b758bd8d0aa21fe75f0026f01c2edf920) (cherry picked from commit 0c888b2b2a07d5d4effb4cdeac706475adf5c6b6) --- 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 e132d04bc..c73771f33 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2800,8 +2800,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); } @@ -4359,10 +4358,8 @@ void __monologue_free(struct call_monologue *m) { free_ssrc_hash(&m->ssrc_hash); 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 241687c86..bced4c40c 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; @@ -1514,39 +1515,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;