diff options
Diffstat (limited to 'drivers/net/wireguard/netlink.c')
| -rw-r--r-- | drivers/net/wireguard/netlink.c | 14 | 
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/wireguard/netlink.c b/drivers/net/wireguard/netlink.c index d0f3b6d7f408..43c8c84e7ea8 100644 --- a/drivers/net/wireguard/netlink.c +++ b/drivers/net/wireguard/netlink.c @@ -436,14 +436,13 @@ static int set_peer(struct wg_device *wg, struct nlattr **attrs)  	if (attrs[WGPEER_A_ENDPOINT]) {  		struct sockaddr *addr = nla_data(attrs[WGPEER_A_ENDPOINT]);  		size_t len = nla_len(attrs[WGPEER_A_ENDPOINT]); +		struct endpoint endpoint = { { { 0 } } }; -		if ((len == sizeof(struct sockaddr_in) && -		     addr->sa_family == AF_INET) || -		    (len == sizeof(struct sockaddr_in6) && -		     addr->sa_family == AF_INET6)) { -			struct endpoint endpoint = { { { 0 } } }; - -			memcpy(&endpoint.addr, addr, len); +		if (len == sizeof(struct sockaddr_in) && addr->sa_family == AF_INET) { +			endpoint.addr4 = *(struct sockaddr_in *)addr; +			wg_socket_set_peer_endpoint(peer, &endpoint); +		} else if (len == sizeof(struct sockaddr_in6) && addr->sa_family == AF_INET6) { +			endpoint.addr6 = *(struct sockaddr_in6 *)addr;  			wg_socket_set_peer_endpoint(peer, &endpoint);  		}  	} @@ -621,6 +620,7 @@ static const struct genl_ops genl_ops[] = {  static struct genl_family genl_family __ro_after_init = {  	.ops = genl_ops,  	.n_ops = ARRAY_SIZE(genl_ops), +	.resv_start_op = WG_CMD_SET_DEVICE + 1,  	.name = WG_GENL_NAME,  	.version = WG_GENL_VERSION,  	.maxattr = WGDEVICE_A_MAX,  |