From 3e2bb5a01a25b7ca44f7c48d5665e9dd9da90ce9 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari Date: Fri, 23 Aug 2024 16:28:24 -0400 Subject: [PATCH] res_pjsip_sdp_rtp fix leaking astobj2 ast_format PR #700 added a preferred_format for the struct ast_rtp_codecs, but when set the preferred_format it leaks an astobj2 ast_format. In the next code ast_rtp_codecs_set_preferred_format(&codecs, ast_format_cap_get_format(joint, 0)); both functions ast_rtp_codecs_set_preferred_format and ast_format_cap_get_format increases the ao2 reference count. Fixes: #856 --- main/rtp_engine.c | 1 + res/res_pjsip_sdp_rtp.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 1ee8f55244..d5846b9323 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -1011,6 +1011,7 @@ void ast_rtp_codecs_payloads_destroy(struct ast_rtp_codecs *codecs) AST_VECTOR_FREE(&codecs->payload_mapping_tx); ao2_t_cleanup(codecs->preferred_format, "destroying ast_rtp_codec preferred format"); + codecs->preferred_format = NULL; ast_rwlock_destroy(&codecs->codecs_lock); } diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index aa6fc94dc3..98df545397 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -544,7 +544,10 @@ static int set_caps(struct ast_sip_session *session, ast_format_cap_get_names(caps, &usbuf), ast_format_cap_get_names(peer, &thembuf)); } else { - ast_rtp_codecs_set_preferred_format(&codecs, ast_format_cap_get_format(joint, 0)); + struct ast_format *preferred_fmt = ast_format_cap_get_format(joint, 0); + + ast_rtp_codecs_set_preferred_format(&codecs, preferred_fmt); + ao2_ref(preferred_fmt, -1); } if (is_offer) {