From 8a1cb14015f17f67ab0defd55eacb03f7fc7c0c2 Mon Sep 17 00:00:00 2001 From: Seven Du Date: Tue, 10 Feb 2015 15:38:15 +0800 Subject: [PATCH] FS-7499: trying to fix rtp data len when rtp extension is used duplicated some code from 4943~4953, but that code has it's own problem, it forget to reset *bytes results to larger frame->datalen could read beyond the buffer, and it also makes stats not accurate. But if we reset *bytes at that place, then later the switch_vb_put_packet has problem because it depends that *bytes. this patch should fix the datalen at least buf still leaves duplicated code and inaccurate stats. --- src/switch_rtp.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index b9db435eae..2da7671b4a 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -5234,6 +5234,24 @@ static switch_status_t read_rtp_packet(switch_rtp_t *rtp_session, switch_size_t } } + /* recalculate body length in case rtp extension used */ + if (!rtp_session->flags[SWITCH_RTP_FLAG_PROXY_MEDIA] && !rtp_session->flags[SWITCH_RTP_FLAG_UDPTL] && + rtp_session->recv_msg.header.version == 2 && rtp_session->recv_msg.header.x) { /* header extensions */ + uint16_t length; + + rtp_session->recv_msg.ext = (switch_rtp_hdr_ext_t *) rtp_session->recv_msg.body; + length = ntohs((uint16_t)rtp_session->recv_msg.ext->length); + + if (length < SWITCH_RTP_MAX_BUF_LEN_WORDS) { + rtp_session->recv_msg.ebody = rtp_session->recv_msg.body + (length * 4) + 4; + if (*bytes > (length * 4 + 4)) { + *bytes -= (length * 4 + 4); + } else { + *bytes = 0; + } + } + } + return status; }