From: Christian Grothoff Date: Fri, 6 Jan 2017 23:19:44 +0000 (+0100) Subject: fix bad cast, add additional assertions that AF is set, avoid unaligned access to... X-Git-Tag: taler-0.2.1~519 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0371316989c99e94c5cf6e32e0cc9dd725339f11;p=oweals%2Fgnunet.git fix bad cast, add additional assertions that AF is set, avoid unaligned access to struct sockaddr_in --- 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; * Name of section in configuration file to use for * additional options. */ -static char *section_name; +static char *section_name = "undefined"; /** * Flag set to 1 if we use IPPROTO_UDP. @@ -340,9 +340,11 @@ run (void *cls, GNUNET_SCHEDULER_shutdown (); return; } + GNUNET_assert (AF_INET == local_sa->sa_family); + GNUNET_assert (AF_INET == remote_sa->sa_family); ret = GNUNET_NAT_request_reversal (nh, - (const struct sockaddr_in *) &local_sa, - (const struct sockaddr_in *) &remote_sa); + (const struct sockaddr_in *) local_sa, + (const struct sockaddr_in *) remote_sa); switch (ret) { 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, const char *buf = (const char *) &message[1]; size_t local_sa_len = ntohs (message->local_addr_size); size_t remote_sa_len = ntohs (message->remote_addr_size); - const struct sockaddr *local_sa = (const struct sockaddr *) &buf[0]; - const struct sockaddr *remote_sa = (const struct sockaddr *) &buf[local_sa_len]; - const struct sockaddr_in *l4 = NULL; - const struct sockaddr_in *r4; + struct sockaddr_in l4; + struct sockaddr_in r4; int ret; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received REQUEST CONNECTION REVERSAL message from client\n"); - switch (local_sa->sa_family) + if (local_sa_len != sizeof (struct sockaddr_in)) { - case AF_INET: - if (local_sa_len != sizeof (struct sockaddr_in)) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (ch->client); - return; - } - l4 = (const struct sockaddr_in *) local_sa; - break; - case AF_INET6: - if (local_sa_len != sizeof (struct sockaddr_in6)) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (ch->client); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Connection reversal for IPv6 not supported yet\n")); - ret = GNUNET_SYSERR; - break; - default: - GNUNET_break (0); + GNUNET_break_op (0); GNUNET_SERVICE_client_drop (ch->client); return; } - switch (remote_sa->sa_family) + if (remote_sa_len != sizeof (struct sockaddr_in)) { - case AF_INET: - if (remote_sa_len != sizeof (struct sockaddr_in)) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (ch->client); - return; - } - r4 = (const struct sockaddr_in *) remote_sa; - ret = GN_request_connection_reversal (&l4->sin_addr, - ntohs (l4->sin_port), - &r4->sin_addr); - break; - case AF_INET6: - if (remote_sa_len != sizeof (struct sockaddr_in6)) - { - GNUNET_break (0); - GNUNET_SERVICE_client_drop (ch->client); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Connection reversal for IPv6 not supported yet\n")); - ret = GNUNET_SYSERR; - break; - default: - GNUNET_break (0); + GNUNET_break_op (0); GNUNET_SERVICE_client_drop (ch->client); return; } + GNUNET_memcpy (&l4, + buf, + sizeof (struct sockaddr_in)); + GNUNET_break_op (AF_INET == l4.sin_family); + buf += sizeof (struct sockaddr_in); + GNUNET_memcpy (&r4, + buf, + sizeof (struct sockaddr_in)); + GNUNET_break_op (AF_INET == r4.sin_family); + ret = GN_request_connection_reversal (&l4.sin_addr, + ntohs (l4.sin_port), + &r4.sin_addr); if (GNUNET_OK != ret) GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("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, if (NULL == nh->mq) return GNUNET_SYSERR; + GNUNET_break (AF_INET == local_sa->sin_family); + GNUNET_break (AF_INET == remote_sa->sin_family); env = GNUNET_MQ_msg_extra (req, 2 * sizeof (struct sockaddr_in), GNUNET_MESSAGE_TYPE_NAT_REQUEST_CONNECTION_REVERSAL);