aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/config.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2016-12-13 02:49:49 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2016-12-13 02:49:49 +0100
commit39c379d80d505aac29f742d4565032ce7c162619 (patch)
treeeda589b336441408f5a9cdd270377f4e16b11db7 /src/config.c
parenthashtables: ensure we get 64-bits of randomness (diff)
downloadwireguard-monolithic-historical-39c379d80d505aac29f742d4565032ce7c162619.tar.xz
wireguard-monolithic-historical-39c379d80d505aac29f742d4565032ce7c162619.zip
peer: don't use sockaddr_storage to reduce memory usage
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/config.c b/src/config.c
index b65e498..197c162 100644
--- a/src/config.c
+++ b/src/config.c
@@ -76,7 +76,7 @@ static int set_peer(struct wireguard_device *wg, void __user *user_peer, size_t
if (netdev_pub(wg)->flags & IFF_UP)
timers_init_peer(peer);
} else
- pr_debug("Peer %Lu (%pISpfsc) modified\n", peer->internal_id, &peer->endpoint.addr_storage);
+ pr_debug("Peer %Lu (%pISpfsc) modified\n", peer->internal_id, &peer->endpoint.addr);
if (in_peer.remove_me) {
peer_put(peer);
@@ -85,7 +85,11 @@ static int set_peer(struct wireguard_device *wg, void __user *user_peer, size_t
}
if (in_peer.endpoint.ss_family == AF_INET || in_peer.endpoint.ss_family == AF_INET6) {
- struct endpoint endpoint = { .addr_storage = in_peer.endpoint };
+ 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;
socket_set_peer_endpoint(peer, &endpoint);
}
@@ -237,7 +241,10 @@ 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);
- out_peer.endpoint = peer->endpoint.addr_storage;
+ if (peer->endpoint.addr.sa_family == AF_INET)
+ *(struct sockaddr_in *)&out_peer.endpoint = peer->endpoint.addr4;
+ else if (peer->endpoint.addr.sa_family == AF_INET6)
+ *(struct sockaddr_in6 *)&out_peer.endpoint = 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;