aboutsummaryrefslogtreecommitdiff
path: root/src/nat
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2017-01-07 00:19:44 +0100
committerChristian Grothoff <christian@grothoff.org>2017-01-07 00:19:44 +0100
commit0371316989c99e94c5cf6e32e0cc9dd725339f11 (patch)
treed4c615f75c3ee3506ba1744b849ff28767a8b329 /src/nat
parenta9c68a4fcb53d599dc5f0816f3330c169f2fe3a7 (diff)
downloadgnunet-0371316989c99e94c5cf6e32e0cc9dd725339f11.tar.gz
gnunet-0371316989c99e94c5cf6e32e0cc9dd725339f11.zip
fix bad cast, add additional assertions that AF is set, avoid unaligned access to struct sockaddr_in
Diffstat (limited to 'src/nat')
-rw-r--r--src/nat/gnunet-nat.c8
-rw-r--r--src/nat/gnunet-service-nat.c71
-rw-r--r--src/nat/nat_api.c2
3 files changed, 25 insertions, 56 deletions
diff --git a/src/nat/gnunet-nat.c b/src/nat/gnunet-nat.c
index 02d68d787..07ddfb6a3 100644
--- a/src/nat/gnunet-nat.c
+++ b/src/nat/gnunet-nat.c
@@ -37,7 +37,7 @@ static int global_ret;
37 * Name of section in configuration file to use for 37 * Name of section in configuration file to use for
38 * additional options. 38 * additional options.
39 */ 39 */
40static char *section_name; 40static char *section_name = "undefined";
41 41
42/** 42/**
43 * Flag set to 1 if we use IPPROTO_UDP. 43 * Flag set to 1 if we use IPPROTO_UDP.
@@ -340,9 +340,11 @@ run (void *cls,
340 GNUNET_SCHEDULER_shutdown (); 340 GNUNET_SCHEDULER_shutdown ();
341 return; 341 return;
342 } 342 }
343 GNUNET_assert (AF_INET == local_sa->sa_family);
344 GNUNET_assert (AF_INET == remote_sa->sa_family);
343 ret = GNUNET_NAT_request_reversal (nh, 345 ret = GNUNET_NAT_request_reversal (nh,
344 (const struct sockaddr_in *) &local_sa, 346 (const struct sockaddr_in *) local_sa,
345 (const struct sockaddr_in *) &remote_sa); 347 (const struct sockaddr_in *) remote_sa);
346 switch (ret) 348 switch (ret)
347 { 349 {
348 case GNUNET_SYSERR: 350 case GNUNET_SYSERR:
diff --git a/src/nat/gnunet-service-nat.c b/src/nat/gnunet-service-nat.c
index 225d37874..95b19a55c 100644
--- a/src/nat/gnunet-service-nat.c
+++ b/src/nat/gnunet-service-nat.c
@@ -1774,71 +1774,36 @@ handle_request_connection_reversal (void *cls,
1774 const char *buf = (const char *) &message[1]; 1774 const char *buf = (const char *) &message[1];
1775 size_t local_sa_len = ntohs (message->local_addr_size); 1775 size_t local_sa_len = ntohs (message->local_addr_size);
1776 size_t remote_sa_len = ntohs (message->remote_addr_size); 1776 size_t remote_sa_len = ntohs (message->remote_addr_size);
1777 const struct sockaddr *local_sa = (const struct sockaddr *) &buf[0]; 1777 struct sockaddr_in l4;
1778 const struct sockaddr *remote_sa = (const struct sockaddr *) &buf[local_sa_len]; 1778 struct sockaddr_in r4;
1779 const struct sockaddr_in *l4 = NULL;
1780 const struct sockaddr_in *r4;
1781 int ret; 1779 int ret;
1782 1780
1783 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1781 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1784 "Received REQUEST CONNECTION REVERSAL message from client\n"); 1782 "Received REQUEST CONNECTION REVERSAL message from client\n");
1785 switch (local_sa->sa_family) 1783 if (local_sa_len != sizeof (struct sockaddr_in))
1786 { 1784 {
1787 case AF_INET: 1785 GNUNET_break_op (0);
1788 if (local_sa_len != sizeof (struct sockaddr_in))
1789 {
1790 GNUNET_break (0);
1791 GNUNET_SERVICE_client_drop (ch->client);
1792 return;
1793 }
1794 l4 = (const struct sockaddr_in *) local_sa;
1795 break;
1796 case AF_INET6:
1797 if (local_sa_len != sizeof (struct sockaddr_in6))
1798 {
1799 GNUNET_break (0);
1800 GNUNET_SERVICE_client_drop (ch->client);
1801 return;
1802 }
1803 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1804 _("Connection reversal for IPv6 not supported yet\n"));
1805 ret = GNUNET_SYSERR;
1806 break;
1807 default:
1808 GNUNET_break (0);
1809 GNUNET_SERVICE_client_drop (ch->client); 1786 GNUNET_SERVICE_client_drop (ch->client);
1810 return; 1787 return;
1811 } 1788 }
1812 switch (remote_sa->sa_family) 1789 if (remote_sa_len != sizeof (struct sockaddr_in))
1813 { 1790 {
1814 case AF_INET: 1791 GNUNET_break_op (0);
1815 if (remote_sa_len != sizeof (struct sockaddr_in))
1816 {
1817 GNUNET_break (0);
1818 GNUNET_SERVICE_client_drop (ch->client);
1819 return;
1820 }
1821 r4 = (const struct sockaddr_in *) remote_sa;
1822 ret = GN_request_connection_reversal (&l4->sin_addr,
1823 ntohs (l4->sin_port),
1824 &r4->sin_addr);
1825 break;
1826 case AF_INET6:
1827 if (remote_sa_len != sizeof (struct sockaddr_in6))
1828 {
1829 GNUNET_break (0);
1830 GNUNET_SERVICE_client_drop (ch->client);
1831 return;
1832 }
1833 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1834 _("Connection reversal for IPv6 not supported yet\n"));
1835 ret = GNUNET_SYSERR;
1836 break;
1837 default:
1838 GNUNET_break (0);
1839 GNUNET_SERVICE_client_drop (ch->client); 1792 GNUNET_SERVICE_client_drop (ch->client);
1840 return; 1793 return;
1841 } 1794 }
1795 GNUNET_memcpy (&l4,
1796 buf,
1797 sizeof (struct sockaddr_in));
1798 GNUNET_break_op (AF_INET == l4.sin_family);
1799 buf += sizeof (struct sockaddr_in);
1800 GNUNET_memcpy (&r4,
1801 buf,
1802 sizeof (struct sockaddr_in));
1803 GNUNET_break_op (AF_INET == r4.sin_family);
1804 ret = GN_request_connection_reversal (&l4.sin_addr,
1805 ntohs (l4.sin_port),
1806 &r4.sin_addr);
1842 if (GNUNET_OK != ret) 1807 if (GNUNET_OK != ret)
1843 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 1808 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
1844 _("Connection reversal request failed\n")); 1809 _("Connection reversal request failed\n"));
diff --git a/src/nat/nat_api.c b/src/nat/nat_api.c
index 06b4b99fa..261b901a9 100644
--- a/src/nat/nat_api.c
+++ b/src/nat/nat_api.c
@@ -678,6 +678,8 @@ GNUNET_NAT_request_reversal (struct GNUNET_NAT_Handle *nh,
678 678
679 if (NULL == nh->mq) 679 if (NULL == nh->mq)
680 return GNUNET_SYSERR; 680 return GNUNET_SYSERR;
681 GNUNET_break (AF_INET == local_sa->sin_family);
682 GNUNET_break (AF_INET == remote_sa->sin_family);
681 env = GNUNET_MQ_msg_extra (req, 683 env = GNUNET_MQ_msg_extra (req,
682 2 * sizeof (struct sockaddr_in), 684 2 * sizeof (struct sockaddr_in),
683 GNUNET_MESSAGE_TYPE_NAT_REQUEST_CONNECTION_REVERSAL); 685 GNUNET_MESSAGE_TYPE_NAT_REQUEST_CONNECTION_REVERSAL);