aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/rtcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/protocols/rtcp.c')
-rw-r--r--src/lib/protocols/rtcp.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/lib/protocols/rtcp.c b/src/lib/protocols/rtcp.c
index 02875648a..f618261dd 100644
--- a/src/lib/protocols/rtcp.c
+++ b/src/lib/protocols/rtcp.c
@@ -35,6 +35,19 @@ void ndpi_search_rtcp(struct ndpi_detection_module_struct *ndpi_struct, struct n
ndpi_int_rtcp_add_connection(ndpi_struct, flow);
}
} else if(packet->udp != NULL) {
+ /* Let's check first the RTCP packet length */
+ u_int16_t len, offset = 0, rtcp_section_len;
+
+ while(offset < packet->payload_packet_len) {
+ len = packet->payload[2+offset] * 256 + packet->payload[2+offset+1];
+ rtcp_section_len = (len + 1) * 4;
+
+ if((offset+rtcp_section_len) > packet->payload_packet_len)
+ goto exclude_rtcp;
+ else
+ offset += rtcp_section_len;
+ }
+
sport = ntohs(packet->udp->source), dport = ntohs(packet->udp->dest);
NDPI_LOG(NDPI_PROTOCOL_RTCP, ndpi_struct, NDPI_LOG_DEBUG, "calculating dport over udp.\n");
if(((packet->payload_packet_len >= 28 || packet->payload_packet_len <= 1200) &&
@@ -45,6 +58,8 @@ void ndpi_search_rtcp(struct ndpi_detection_module_struct *ndpi_struct, struct n
ndpi_int_rtcp_add_connection(ndpi_struct, flow);
}
} else {
+ exclude_rtcp:
+
NDPI_LOG(NDPI_PROTOCOL_RTCP, ndpi_struct, NDPI_LOG_DEBUG, "exclude RTCP.\n");
NDPI_ADD_PROTOCOL_TO_BITMASK(flow->excluded_protocol_bitmask, NDPI_PROTOCOL_RTCP);
}