aboutsummaryrefslogtreecommitdiff
path: root/src/nat
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-01-23 14:01:34 +0100
committerChristian Grothoff <christian@grothoff.org>2017-01-23 14:01:34 +0100
commit990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa (patch)
treef3df7a883d9b23094dcc3f093424fafc25540818 /src/nat
parent60ebf6febc36dffdcdec32d8968ec9706802e6f7 (diff)
downloadgnunet-990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa.tar.gz
gnunet-990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa.zip
fix unaligned access
Diffstat (limited to 'src/nat')
-rw-r--r--src/nat/gnunet-service-nat.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/nat/gnunet-service-nat.c b/src/nat/gnunet-service-nat.c
index 98d87262e..bfe212308 100644
--- a/src/nat/gnunet-service-nat.c
+++ b/src/nat/gnunet-service-nat.c
@@ -1434,8 +1434,8 @@ handle_register (void *cls,
1434 off = (const char *) &message[1]; 1434 off = (const char *) &message[1];
1435 for (unsigned int i=0;i<ch->num_caddrs;i++) 1435 for (unsigned int i=0;i<ch->num_caddrs;i++)
1436 { 1436 {
1437 size_t alen;
1438 const struct sockaddr *sa = (const struct sockaddr *) off; 1437 const struct sockaddr *sa = (const struct sockaddr *) off;
1438 size_t alen;
1439 uint16_t port; 1439 uint16_t port;
1440 int is_nat; 1440 int is_nat;
1441 1441
@@ -1450,22 +1450,28 @@ handle_register (void *cls,
1450 { 1450 {
1451 case AF_INET: 1451 case AF_INET:
1452 { 1452 {
1453 const struct sockaddr_in *s4 = (const struct sockaddr_in *) sa; 1453 struct sockaddr_in s4;
1454 1454
1455 GNUNET_memcpy (&s4,
1456 off,
1457 sizeof (struct sockaddr_in));
1455 alen = sizeof (struct sockaddr_in); 1458 alen = sizeof (struct sockaddr_in);
1456 if (is_nat_v4 (&s4->sin_addr)) 1459 if (is_nat_v4 (&s4.sin_addr))
1457 is_nat = GNUNET_YES; 1460 is_nat = GNUNET_YES;
1458 port = ntohs (s4->sin_port); 1461 port = ntohs (s4.sin_port);
1459 } 1462 }
1460 break; 1463 break;
1461 case AF_INET6: 1464 case AF_INET6:
1462 { 1465 {
1463 const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) sa; 1466 struct sockaddr_in6 s6;
1464 1467
1468 GNUNET_memcpy (&s6,
1469 off,
1470 sizeof (struct sockaddr_in6));
1465 alen = sizeof (struct sockaddr_in6); 1471 alen = sizeof (struct sockaddr_in6);
1466 if (is_nat_v6 (&s6->sin6_addr)) 1472 if (is_nat_v6 (&s6.sin6_addr))
1467 is_nat = GNUNET_YES; 1473 is_nat = GNUNET_YES;
1468 port = ntohs (s6->sin6_port); 1474 port = ntohs (s6.sin6_port);
1469 } 1475 }
1470 break; 1476 break;
1471#if AF_UNIX 1477#if AF_UNIX
@@ -1483,7 +1489,7 @@ handle_register (void *cls,
1483 GNUNET_assert (alen <= left); 1489 GNUNET_assert (alen <= left);
1484 GNUNET_assert (alen <= sizeof (struct sockaddr_storage)); 1490 GNUNET_assert (alen <= sizeof (struct sockaddr_storage));
1485 GNUNET_memcpy (&ch->caddrs[i].ss, 1491 GNUNET_memcpy (&ch->caddrs[i].ss,
1486 sa, 1492 off,
1487 alen); 1493 alen);
1488 1494
1489 /* If applicable, try UPNPC NAT punching */ 1495 /* If applicable, try UPNPC NAT punching */