aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/stun.c
diff options
context:
space:
mode:
authorNardi Ivan <nardi.ivan@gmail.com>2024-03-19 19:48:41 +0100
committerIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2024-03-20 09:39:15 +0100
commitf758f3605a25a9e4618f3b7773b4baab3783674b (patch)
treeed5bf283043e434714a9a1453454e6aba8202da6 /src/lib/protocols/stun.c
parentee87c4bc66bba569c2142fb2c53d6c8cf6969b77 (diff)
STUN: dissection of TURN Channel Data
Diffstat (limited to 'src/lib/protocols/stun.c')
-rw-r--r--src/lib/protocols/stun.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/lib/protocols/stun.c b/src/lib/protocols/stun.c
index 7f79adc9d..4f7652491 100644
--- a/src/lib/protocols/stun.c
+++ b/src/lib/protocols/stun.c
@@ -555,7 +555,33 @@ static int stun_search_again(struct ndpi_detection_module_struct *ndpi_struct,
} else if(first_byte <= 79) {
if(flow->stun.is_turn) {
NDPI_LOG_DBG(ndpi_struct, "TURN range\n");
- /* TODO */
+
+ if(packet->payload_packet_len >= 4) {
+ u_int16_t ch_len;
+
+ ch_len = ntohs(*(u_int16_t *)&packet->payload[2]);
+
+ if(ch_len <= packet->payload_packet_len - 4) {
+ const u_int8_t *orig_payload;
+ u_int16_t orig_payload_length;
+
+ orig_payload = packet->payload;
+ orig_payload_length = packet->payload_packet_len;
+ packet->payload = packet->payload + 4;
+ packet->payload_packet_len = ch_len;
+
+ stun_search_again(ndpi_struct, flow);
+ NDPI_LOG_DBG(ndpi_struct, "End recursion on turn channel\n");
+
+ packet->payload = orig_payload;
+ packet->payload_packet_len = orig_payload_length;
+
+ } else {
+ if(flow->l4_proto == IPPROTO_UDP) /* The error is quite common on TCP since we don't reassemble msgs */
+ NDPI_LOG_DBG(ndpi_struct, "Invalid channel length %d %d\n",
+ ch_len, packet->payload_packet_len - 4);
+ }
+ }
} else {
NDPI_LOG_DBG(ndpi_struct, "QUIC range (not turn). Unexpected\n");
}