aboutsummaryrefslogtreecommitdiff
path: root/src/lib/protocols/stun.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/protocols/stun.c')
-rw-r--r--src/lib/protocols/stun.c64
1 files changed, 44 insertions, 20 deletions
diff --git a/src/lib/protocols/stun.c b/src/lib/protocols/stun.c
index cbb5eb1f0..f24731333 100644
--- a/src/lib/protocols/stun.c
+++ b/src/lib/protocols/stun.c
@@ -199,12 +199,18 @@ static void parse_ip_port_attribute(const u_int8_t *payload, u_int16_t payload_l
u_int16_t port = ntohs(*((u_int16_t*)&payload[off+6]));
u_int32_t ip = ntohl(*((u_int32_t*)&payload[off+8]));
- ap->port = port;
- ap->address.v4 = htonl(ip);
- ap->is_ipv6 = 0;
+ /* Only the first attribute ever in the flow */
+ if(ap->port == 0) {
+ ap->port = port;
+ ap->address.v4 = htonl(ip);
+ ap->is_ipv6 = 0;
+ }
- if(ap_monit)
- memcpy(ap_monit, ap, sizeof(*ap_monit));
+ if(ap_monit) {
+ ap_monit->port = port;
+ ap_monit->address.v4 = htonl(ip);
+ ap_monit->is_ipv6 = 0;
+ }
} else if(protocol_family == 0x02 /* IPv6 */ &&
real_len == 20) {
u_int16_t port = ntohs(*((u_int16_t*)&payload[off+6]));
@@ -215,12 +221,18 @@ static void parse_ip_port_attribute(const u_int8_t *payload, u_int16_t payload_l
ip[2] = *((u_int32_t *)&payload[off + 16]);
ip[3] = *((u_int32_t *)&payload[off + 20]);
- ap->port = port;
- memcpy(&ap->address, &ip, 16);
- ap->is_ipv6 = 1;
+ /* Only the first attribute ever in the flow */
+ if(ap->port == 0) {
+ ap->port = port;
+ memcpy(&ap->address, &ip, 16);
+ ap->is_ipv6 = 1;
+ }
- if(ap_monit)
- memcpy(ap_monit, ap, sizeof(*ap_monit));
+ if(ap_monit) {
+ ap_monit->port = port;
+ memcpy(&ap_monit->address, &ip, 16);
+ ap_monit->is_ipv6 = 1;
+ }
}
}
}
@@ -249,12 +261,18 @@ static void parse_xor_ip_port_attribute(struct ndpi_detection_module_struct *ndp
port = ntohs(*((u_int16_t *)&payload[off + 6])) ^ (magic_cookie >> 16);
ip = *((u_int32_t *)&payload[off + 8]) ^ htonl(magic_cookie);
- ap->port = port;
- ap->address.v4 = ip;
- ap->is_ipv6 = 0;
+ /* Only the first attribute ever in the flow */
+ if(ap->port == 0) {
+ ap->port = port;
+ ap->address.v4 = ip;
+ ap->is_ipv6 = 0;
+ }
- if(ap_monit)
- memcpy(ap_monit, ap, sizeof(*ap_monit));
+ if(ap_monit) {
+ ap_monit->port = port;
+ ap_monit->address.v4 = ip;
+ ap_monit->is_ipv6 = 0;
+ }
if(add_to_cache) {
NDPI_LOG_DBG(ndpi_struct, "Peer %s:%d [proto %d]\n",
@@ -284,12 +302,18 @@ static void parse_xor_ip_port_attribute(struct ndpi_detection_module_struct *ndp
ip[2] = *((u_int32_t *)&payload[off + 16]) ^ htonl(transaction_id[1]);
ip[3] = *((u_int32_t *)&payload[off + 20]) ^ htonl(transaction_id[2]);
- ap->port = port;
- memcpy(&ap->address, &ip, 16);
- ap->is_ipv6 = 1;
+ /* Only the first attribute ever in the flow */
+ if(ap->port == 0) {
+ ap->port = port;
+ memcpy(&ap->address, &ip, 16);
+ ap->is_ipv6 = 1;
+ }
- if(ap_monit)
- memcpy(ap_monit, ap, sizeof(*ap_monit));
+ if(ap_monit) {
+ ap_monit->port = port;
+ memcpy(&ap_monit->address, &ip, 16);
+ ap_monit->is_ipv6 = 1;
+ }
if(add_to_cache) {
NDPI_LOG_DBG(ndpi_struct, "Peer %s:%d [proto %d]\n",