]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_sdp_rtp fix leaking astobj2 ast_format
authorAlexei Gradinari <alex2grad@gmail.com>
Fri, 23 Aug 2024 20:28:24 +0000 (16:28 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Tue, 3 Sep 2024 14:03:08 +0000 (14:03 +0000)
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
res/res_pjsip_sdp_rtp.c

index 62f79ae5e9b0c5ea2192c1e8981ebe90548df4c1..621f12ca008f34b6e1fefa2df30ffc1f4eaeb986 100644 (file)
@@ -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);
 }
index aa6fc94dc337c5534d7442266bd6c1157af32253..98df545397bd5172dc718711e26524f01e1ed209 100644 (file)
@@ -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) {