aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/stun.c
diff options
context:
space:
mode:
authorIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2024-03-14 14:20:51 +0100
committerGitHub <noreply@github.com>2024-03-14 14:20:51 +0100
commit97fae6e00ad5b529ecc94a0bde2328da43426080 (patch)
treec1e375101d284dcfe3dd8740739a9f6123a51f81 /src/lib/protocols/stun.c
parent37ddf02e635c98d528a2ff3978f1f98bc926af26 (diff)
STUN: fix parsing of DATA attribute (#2345)
Diffstat (limited to 'src/lib/protocols/stun.c')
-rw-r--r--src/lib/protocols/stun.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/lib/protocols/stun.c b/src/lib/protocols/stun.c
index 737a8448e..9b6274753 100644
--- a/src/lib/protocols/stun.c
+++ b/src/lib/protocols/stun.c
@@ -311,18 +311,21 @@ int is_stun(struct ndpi_detection_module_struct *ndpi_struct,
return 1;
case 0x0013:
- NDPI_LOG_DBG(ndpi_struct, "DATA attribute\n");
+ NDPI_LOG_DBG(ndpi_struct, "DATA attribute (%d/%d)\n",
+ real_len, payload_length - off - 4);
- orig_payload = packet->payload;
- orig_payload_length = packet->payload_packet_len;
- packet->payload = payload + off + 4;
- packet->payload_packet_len = payload_length - off - 4;
+ if(real_len <= payload_length - off - 4) {
+ orig_payload = packet->payload;
+ orig_payload_length = packet->payload_packet_len;
+ packet->payload = payload + off + 4;
+ packet->payload_packet_len = real_len;
- stun_search_again(ndpi_struct, flow);
- NDPI_LOG_DBG(ndpi_struct, "End recursion\n");
+ stun_search_again(ndpi_struct, flow);
+ NDPI_LOG_DBG(ndpi_struct, "End recursion\n");
- packet->payload = orig_payload;
- packet->payload_packet_len = orig_payload_length;
+ packet->payload = orig_payload;
+ packet->payload_packet_len = orig_payload_length;
+ }
break;
@@ -424,6 +427,9 @@ static int stun_search_again(struct ndpi_detection_module_struct *ndpi_struct,
if(flow->tls_quic.certificate_processed == 1) {
NDPI_LOG_DBG(ndpi_struct, "Interesting DTLS stuff already processed. Ignoring\n");
} else {
+ NDPI_LOG_DBG(ndpi_struct, "Switch to DTLS (%d/%d)\n",
+ flow->detected_protocol_stack[0], flow->detected_protocol_stack[1]);
+
if(flow->stun.maybe_dtls == 0) {
/* First DTLS packet of the flow */
first_dtls_pkt = 1;
@@ -443,8 +449,6 @@ static int stun_search_again(struct ndpi_detection_module_struct *ndpi_struct,
flow->max_extra_packets_to_check = ndpi_min(255, (int)flow->max_extra_packets_to_check + 10);
flow->stun.maybe_dtls = 1;
}
- NDPI_LOG_DBG(ndpi_struct, "Switch to TLS (%d/%d)\n",
- flow->detected_protocol_stack[0], flow->detected_protocol_stack[1]);
switch_to_tls(ndpi_struct, flow, first_dtls_pkt);