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) {