From 6bca09c08f1e95ab0f86a331b6a32476a2bd1faf Mon Sep 17 00:00:00 2001 From: Christian Spielberger Date: Wed, 3 Jan 2024 17:17:26 +0100 Subject: [PATCH] rtp: lock more fields from rtcp_sess --- src/rtp/sess.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/rtp/sess.c b/src/rtp/sess.c index 9aa832f33..be7eeff33 100644 --- a/src/rtp/sess.c +++ b/src/rtp/sess.c @@ -103,11 +103,13 @@ static struct rtp_member *get_member(struct rtcp_sess *sess, uint32_t src) if (sess->memberc >= MAX_MEMBERS) return NULL; + mtx_lock(sess->lock); mbr = member_add(sess->members, src); if (!mbr) return NULL; ++sess->memberc; + mtx_unlock(sess->lock); return mbr; } @@ -357,8 +359,10 @@ int rtcp_enable(struct rtcp_sess *sess, bool enabled, const char *cname) if (!sess) return EINVAL; + mtx_lock(sess->lock); sess->cname = mem_deref(sess->cname); err = str_dup(&sess->cname, cname); + mtx_unlock(sess->lock); if (err) return err; @@ -589,6 +593,7 @@ void rtcp_sess_rx_rtp(struct rtcp_sess *sess, struct rtp_header *hdr, return; } + mtx_lock(sess->lock); if (!mbr->s) { int err; @@ -598,6 +603,7 @@ void rtcp_sess_rx_rtp(struct rtcp_sess *sess, struct rtp_header *hdr, else err = mutex_alloc(&mbr->s->lock); + mtx_unlock(sess->lock); if (err) { DEBUG_NOTICE("could not add sender: 0x%08x\n", hdr->ssrc); @@ -611,28 +617,42 @@ void rtcp_sess_rx_rtp(struct rtcp_sess *sess, struct rtp_header *hdr, /* probation not used */ sa_cpy(&mbr->s->rtp_peer, peer); source_unlock(mbr->s); + mtx_lock(sess->lock); ++sess->senderc; + mtx_unlock(sess->lock); + } + else { + mtx_unlock(sess->lock); } source_lock(mbr->s); if (!source_update_seq(mbr->s, hdr->seq)) { DEBUG_WARNING("rtp_update_seq() returned 0\n"); } + source_unlock(mbr->s); + mtx_lock(sess->lock); if (sess->srate_rx) { /* Convert from wall-clock time to timestamp units */ hdr->ts_arrive = tmr_jiffies() * sess->srate_rx / 1000; + mtx_unlock(sess->lock); /* * Calculate jitter only when the timestamp is different than * last packet (see RTP FAQ * https://www.cs.columbia.edu/~hgs/rtp/faq.html#jitter). */ + source_lock(mbr->s); if (hdr->ts != mbr->s->last_rtp_ts) source_calc_jitter(mbr->s, hdr->ts, (uint32_t)hdr->ts_arrive); + source_unlock(mbr->s); + } + else { + mtx_unlock(sess->lock); } + source_lock(mbr->s); mbr->s->last_rtp_ts = hdr->ts; mbr->s->rtp_rx_bytes += payload_size; source_unlock(mbr->s); @@ -738,6 +758,7 @@ int rtcp_debug(struct re_printf *pf, const struct rtp_sock *rs) return 0; err |= re_hprintf(pf, "----- RTCP Session: -----\n"); + mtx_lock(sess->lock); err |= re_hprintf(pf, " cname=%s SSRC=0x%08x/%u rx=%uHz\n", sess->cname, rtp_sess_ssrc(sess->rs), rtp_sess_ssrc(sess->rs), @@ -745,7 +766,6 @@ int rtcp_debug(struct re_printf *pf, const struct rtp_sock *rs) hash_apply(sess->members, debug_handler, pf); - mtx_lock(sess->lock); err |= re_hprintf(pf, " TX: packets=%u, octets=%u\n", sess->txstat.psent, sess->txstat.osent); mtx_unlock(sess->lock);