From fba001c3b0339c996ca3450cfa06d61af2cb5146 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 20 Apr 2026 14:56:40 -0400 Subject: [PATCH] MT#55283 prevent SSRC deadlock Closes #2095 Change-Id: I693924eba5c7896f1efa9123cce606db97b0086c --- daemon/rtcp.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 11c97302d..3c9f59e18 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1444,6 +1444,13 @@ static GString *rtcp_sender_report(struct ssrc_sender_report *ssr, int i = 0, n = 0; while (rrs->length) { struct ssrc_entry_call *s = t_queue_pop_head(rrs); + + // don't send a receiver report for ourselves. prevents possible deadlock + if (s->h.ssrc == ssrc) { + ssrc_entry_release(s); + continue; + } + if (i < 30) { g_string_set_size(ret, ret->len + sizeof(struct report_block)); struct report_block *rr = (void *) ret->str + ret->len - sizeof(struct report_block); @@ -1560,6 +1567,7 @@ static void rtcp_receiver_reports(ssrc_q *out, struct ssrc_hash *hash) { // call must be locked in R // if a `ps` is locked, it must be passed as argument +// ssrc_out may be locked void rtcp_send_report(struct call_media *media, struct ssrc_entry_call *ssrc_out, const struct packet_stream *locked) {