diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-01-07 00:19:44 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-01-07 00:19:44 +0100 |
commit | 0371316989c99e94c5cf6e32e0cc9dd725339f11 (patch) | |
tree | d4c615f75c3ee3506ba1744b849ff28767a8b329 /src | |
parent | a9c68a4fcb53d599dc5f0816f3330c169f2fe3a7 (diff) | |
download | gnunet-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')
-rw-r--r-- | src/nat/gnunet-nat.c | 8 | ||||
-rw-r--r-- | src/nat/gnunet-service-nat.c | 71 | ||||
-rw-r--r-- | src/nat/nat_api.c | 2 |
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 | */ |
40 | static char *section_name; | 40 | static 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); |