commit 0371316989c99e94c5cf6e32e0cc9dd725339f11
parent a9c68a4fcb53d599dc5f0816f3330c169f2fe3a7
Author: Christian Grothoff <christian@grothoff.org>
Date: Sat, 7 Jan 2017 00:19:44 +0100
fix bad cast, add additional assertions that AF is set, avoid unaligned access to struct sockaddr_in
Diffstat:
3 files changed, 25 insertions(+), 56 deletions(-)
diff --git 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
@@ -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
@@ -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);