From ffb37250f968297bf3cc50a87c63a18d54efcbd0 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 10 Jan 2017 05:52:06 +0100 Subject: uapi: use sockaddr union instead of sockaddr_storage --- src/config.c | 13 +++++-------- src/tools/config.c | 6 +++--- src/tools/show.c | 18 +++++++++--------- src/tools/showconf.c | 10 +++++----- src/uapi.h | 6 +++++- 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/config.c b/src/config.c index 6158cc8..5d2b825 100644 --- a/src/config.c +++ b/src/config.c @@ -74,12 +74,9 @@ static int set_peer(struct wireguard_device *wg, void __user *user_peer, size_t goto out; } - if (in_peer.endpoint.ss_family == AF_INET || in_peer.endpoint.ss_family == AF_INET6) { - struct endpoint endpoint = { { { 0 } } }; - if (in_peer.endpoint.ss_family == AF_INET) - endpoint.addr4 = *(struct sockaddr_in *)&in_peer.endpoint; - else if (in_peer.endpoint.ss_family == AF_INET6) - endpoint.addr6 = *(struct sockaddr_in6 *)&in_peer.endpoint; + if (in_peer.endpoint.addr.sa_family == AF_INET || in_peer.endpoint.addr.sa_family == AF_INET6) { + struct endpoint endpoint = { 0 }; + memcpy(&endpoint, &in_peer.endpoint, sizeof(in_peer.endpoint)); socket_set_peer_endpoint(peer, &endpoint); } @@ -242,9 +239,9 @@ static int populate_peer(struct wireguard_peer *peer, void *ctx) memcpy(out_peer.public_key, peer->handshake.remote_static, NOISE_PUBLIC_KEY_LEN); read_lock_bh(&peer->endpoint_lock); if (peer->endpoint.addr.sa_family == AF_INET) - *(struct sockaddr_in *)&out_peer.endpoint = peer->endpoint.addr4; + out_peer.endpoint.addr4 = peer->endpoint.addr4; else if (peer->endpoint.addr.sa_family == AF_INET6) - *(struct sockaddr_in6 *)&out_peer.endpoint = peer->endpoint.addr6; + out_peer.endpoint.addr6 = peer->endpoint.addr6; read_unlock_bh(&peer->endpoint_lock); out_peer.last_handshake_time = peer->walltime_last_handshake; out_peer.tx_bytes = peer->tx_bytes; diff --git a/src/tools/config.c b/src/tools/config.c index f326389..83c7db1 100644 --- a/src/tools/config.c +++ b/src/tools/config.c @@ -119,7 +119,7 @@ static inline bool parse_ip(struct wgipmask *ipmask, const char *value) return true; } -static inline bool parse_endpoint(struct sockaddr_storage *endpoint, const char *value) +static inline bool parse_endpoint(struct sockaddr *endpoint, const char *value) { char *mutable = strdup(value); char *begin, *end; @@ -293,7 +293,7 @@ static bool process_line(struct config_ctx *ctx, const char *line) goto error; } else if (ctx->is_peer_section) { if (key_match("Endpoint")) - ret = parse_endpoint(&peer_from_offset(ctx->buf.dev, ctx->peer_offset)->endpoint, value); + ret = parse_endpoint(&peer_from_offset(ctx->buf.dev, ctx->peer_offset)->endpoint.addr, value); else if (key_match("PublicKey")) ret = parse_key(peer_from_offset(ctx->buf.dev, ctx->peer_offset)->public_key, value); else if (key_match("AllowedIPs")) @@ -500,7 +500,7 @@ bool config_read_cmd(struct wgdevice **device, char *argv[], int argc) argv += 1; argc -= 1; } else if (!strcmp(argv[0], "endpoint") && argc >= 2 && buf.dev->num_peers) { - if (!parse_endpoint(&peer_from_offset(buf.dev, peer_offset)->endpoint, argv[1])) + if (!parse_endpoint(&peer_from_offset(buf.dev, peer_offset)->endpoint.addr, argv[1])) goto error; argv += 2; argc -= 2; diff --git a/src/tools/show.c b/src/tools/show.c index 5257d43..04a634c 100644 --- a/src/tools/show.c +++ b/src/tools/show.c @@ -107,7 +107,7 @@ static char *ip(const struct wgipmask *ip) return buf; } -static char *endpoint(const struct sockaddr_storage *addr) +static char *endpoint(const struct sockaddr *addr) { char host[4096 + 1]; char service[512 + 1]; @@ -116,16 +116,16 @@ static char *endpoint(const struct sockaddr_storage *addr) socklen_t addr_len = 0; memset(buf, 0, sizeof(buf)); - if (addr->ss_family == AF_INET) + if (addr->sa_family == AF_INET) addr_len = sizeof(struct sockaddr_in); - else if (addr->ss_family == AF_INET6) + else if (addr->sa_family == AF_INET6) addr_len = sizeof(struct sockaddr_in6); - ret = getnameinfo((struct sockaddr *)addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST); + ret = getnameinfo(addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST); if (ret) strncpy(buf, gai_strerror(ret), sizeof(buf) - 1); else - snprintf(buf, sizeof(buf) - 1, (addr->ss_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service); + snprintf(buf, sizeof(buf) - 1, (addr->sa_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service); return buf; } @@ -228,8 +228,8 @@ static void pretty_print(struct wgdevice *device) } for_each_wgpeer(device, peer, i) { terminal_printf(TERMINAL_FG_YELLOW TERMINAL_BOLD "peer" TERMINAL_RESET ": " TERMINAL_FG_YELLOW "%s" TERMINAL_RESET "\n", key(peer->public_key)); - if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6) - terminal_printf(" " TERMINAL_BOLD "endpoint" TERMINAL_RESET ": %s\n", endpoint(&peer->endpoint)); + if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6) + terminal_printf(" " TERMINAL_BOLD "endpoint" TERMINAL_RESET ": %s\n", endpoint(&peer->endpoint.addr)); terminal_printf(" " TERMINAL_BOLD "allowed ips" TERMINAL_RESET ": "); if (peer->num_ipmasks) { for_each_wgipmask(peer, ipmask, j) @@ -276,8 +276,8 @@ static bool ugly_print(struct wgdevice *device, const char *param, bool with_int printf("%s\t", device->interface); for_each_wgpeer(device, peer, i) { printf("%s\t", key(peer->public_key)); - if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6) - printf("%s\n", endpoint(&peer->endpoint)); + if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6) + printf("%s\n", endpoint(&peer->endpoint.addr)); else printf("(none)\n"); } diff --git a/src/tools/showconf.c b/src/tools/showconf.c index f04caa1..fe811e6 100644 --- a/src/tools/showconf.c +++ b/src/tools/showconf.c @@ -75,18 +75,18 @@ int showconf_main(int argc, char *argv[]) if (peer->num_ipmasks) printf("\n"); - if (peer->endpoint.ss_family == AF_INET || peer->endpoint.ss_family == AF_INET6) { + if (peer->endpoint.addr.sa_family == AF_INET || peer->endpoint.addr.sa_family == AF_INET6) { char host[4096 + 1]; char service[512 + 1]; static char buf[sizeof(host) + sizeof(service) + 4]; socklen_t addr_len = 0; memset(buf, 0, sizeof(buf)); - if (peer->endpoint.ss_family == AF_INET) + if (peer->endpoint.addr.sa_family == AF_INET) addr_len = sizeof(struct sockaddr_in); - else if (peer->endpoint.ss_family == AF_INET6) + else if (peer->endpoint.addr.sa_family == AF_INET6) addr_len = sizeof(struct sockaddr_in6); - if (!getnameinfo((struct sockaddr *)&peer->endpoint, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST)) { - snprintf(buf, sizeof(buf) - 1, (peer->endpoint.ss_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service); + if (!getnameinfo(&peer->endpoint.addr, addr_len, host, sizeof(host), service, sizeof(service), NI_DGRAM | NI_NUMERICSERV | NI_NUMERICHOST)) { + snprintf(buf, sizeof(buf) - 1, (peer->endpoint.addr.sa_family == AF_INET6 && strchr(host, ':')) ? "[%s]:%s" : "%s:%s", host, service); printf("Endpoint = %s\n", buf); } } diff --git a/src/uapi.h b/src/uapi.h index e5d7368..df45c96 100644 --- a/src/uapi.h +++ b/src/uapi.h @@ -105,7 +105,11 @@ struct wgpeer { __u8 public_key[WG_KEY_LEN]; /* Get/Set */ __u32 flags; /* Set */ - struct sockaddr_storage endpoint; /* Get/Set */ + union { + struct sockaddr addr; + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + } endpoint; /* Get/Set */ struct timeval last_handshake_time; /* Get */ __u64 rx_bytes, tx_bytes; /* Get */ -- cgit v1.2.3-59-g8ed1b