From 7cbb8216a8056d6d9c85a1070f25f777cca93e66 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 70034258af3d1f3264a461517281dc9b2ddc3a2a) --- 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 c39a8dd8b..711545d25 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2743,8 +2743,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); } @@ -4307,10 +4306,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 c720f5e04..e86eee704 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -33,6 +33,7 @@ #include "ssrc.h" #include "main.h" #include "codec.h" +#include "sdp.h" typedef union { GQueue *q; @@ -1521,39 +1522,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_slice_alloc0(sizeof(*ml->session_sdp_orig)); 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_slice_alloc0(sizeof(*ml->session_last_sdp_orig)); 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;