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 a7a43c9b75)
mr13.2
Richard Fuchs 7 months ago
parent 5e7406c1d5
commit 70034258af

@ -2743,8 +2743,7 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c
/* origin (name, version etc.) */ /* origin (name, version etc.) */
if (flags->session_sdp_orig.parsed) { 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); 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); free_ssrc_hash(&m->ssrc_hash);
if (m->last_out_sdp) if (m->last_out_sdp)
g_string_free(m->last_out_sdp, TRUE); g_string_free(m->last_out_sdp, TRUE);
if (m->session_sdp_orig) sdp_orig_free(m->session_sdp_orig);
sdp_orig_free(m->session_sdp_orig); sdp_orig_free(m->session_last_sdp_orig);
if (m->session_last_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->generic_attributes, sdp_attr_free);
t_queue_clear_full(&m->all_attributes, sdp_attr_free); t_queue_clear_full(&m->all_attributes, sdp_attr_free);
t_queue_clear(&m->tag_aliases); t_queue_clear(&m->tag_aliases);

@ -33,6 +33,7 @@
#include "ssrc.h" #include "ssrc.h"
#include "main.h" #include "main.h"
#include "codec.h" #include "codec.h"
#include "sdp.h"
typedef union { typedef union {
GQueue *q; 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); ml->sdp_session_timing = call_str_cpy(&s);
/* o= */ /* o= */
if (!redis_hash_get_str(&s, rh, "sdp_orig_parsed")) { 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 = g_slice_alloc0(sizeof(*ml->session_sdp_orig));
ml->session_sdp_orig->parsed = 1; ml->session_sdp_orig->parsed = 1;
redis_hash_get_llu(&ml->session_sdp_orig->version_num, rh, "sdp_orig_version_num"); 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")) 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")) 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")) 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")) 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")) 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")) 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*/ /* o= last used of the other side*/
if (!redis_hash_get_str(&s, rh, "last_sdp_orig_parsed")) { 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 = g_slice_alloc0(sizeof(*ml->session_last_sdp_orig));
ml->session_last_sdp_orig->parsed = 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"); 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")) 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")) 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")) 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")) 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")) 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")) 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; ml->sdp_session_bandwidth.as = (!redis_hash_get_ld(&il, rh, "sdp_session_as")) ? il : -1;

Loading…
Cancel
Save