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)
(cherry picked from commit 0c888b2b2a)
mr13.3.1
Richard Fuchs 7 months ago
parent a85d9251b1
commit 9aef7cc068

@ -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);

@ -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;

Loading…
Cancel
Save