aboutsummaryrefslogtreecommitdiff
path: root/src/nat/gnunet-service-nat.c
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/gnunet-service-nat.c
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/gnunet-service-nat.c')
-rw-r--r--src/nat/gnunet-service-nat.c71
1 files changed, 18 insertions, 53 deletions
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"));