diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-01-23 14:01:34 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-01-23 14:01:34 +0100 |
commit | 990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa (patch) | |
tree | f3df7a883d9b23094dcc3f093424fafc25540818 /src/nat | |
parent | 60ebf6febc36dffdcdec32d8968ec9706802e6f7 (diff) | |
download | gnunet-990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa.tar.gz gnunet-990c75c9d7d1c8eb3d68c1eb9f49d131abb0deaa.zip |
fix unaligned access
Diffstat (limited to 'src/nat')
-rw-r--r-- | src/nat/gnunet-service-nat.c | 22 |
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 */ |