summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2019-02-23 13:24:19 +0000
committerkrw <krw@openbsd.org>2019-02-23 13:24:19 +0000
commit4e02d32a9d61b74736e5d36cd16cfa18e00c748f (patch)
tree5646356d36fd88c5b0cb925ffe74e9cdec7be231
parentopenssh-7.9 accidentally reused the server's algorithm lists in the (diff)
downloadwireguard-openbsd-4e02d32a9d61b74736e5d36cd16cfa18e00c748f.tar.xz
wireguard-openbsd-4e02d32a9d61b74736e5d36cd16cfa18e00c748f.zip
Restore pre-a2k19 behaviour of clearing out all existing addresses
when setting new address. That change needs specific consideration rather than inadvertant inclusion, especially after claiming no functional change was being made. Change and related problems noted and reversion tested by Kurt Mosiejczuk.
-rw-r--r--sbin/dhclient/kroute.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/sbin/dhclient/kroute.c b/sbin/dhclient/kroute.c
index c2d4699a060..dc38e7103ad 100644
--- a/sbin/dhclient/kroute.c
+++ b/sbin/dhclient/kroute.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.159 2019/02/12 16:50:44 krw Exp $ */
+/* $OpenBSD: kroute.c,v 1.160 2019/02/23 13:24:19 krw Exp $ */
/*
* Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -51,7 +51,7 @@
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-int find_address(char *, struct in_addr, struct in_addr);
+int delete_addresses(char *, int, struct in_addr, struct in_addr);
void set_address(char *, int, struct in_addr, struct in_addr);
void delete_address(char *, int, struct in_addr);
@@ -72,20 +72,23 @@ char *set_resolv_conf(char *, uint8_t *, unsigned int,
void set_mtu(char *, int, uint16_t);
/*
- * find_address() attempts to find newaddr/newmask in the addresses configured
- * on the named interface.
+ * delete_addresses() removes all inet addresses on the named interface, except
+ * for newaddr/newnetmask.
*
- * If the new addr/mask is already present, return 0, else 1.
+ * If newaddr/newmask is already present, return 0, else 1.
*/
int
-find_address(char *name, struct in_addr newaddr, struct in_addr newnetmask)
+delete_addresses(char *name, int ioctlfd, struct in_addr newaddr,
+ struct in_addr newnetmask)
{
struct in_addr addr, netmask;
struct ifaddrs *ifap, *ifa;
+ int found;
if (getifaddrs(&ifap) != 0)
fatal("getifaddrs");
+ found = 0;
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
if ((ifa->ifa_flags & IFF_LOOPBACK) != 0 ||
(ifa->ifa_flags & IFF_POINTOPOINT) != 0 ||
@@ -103,13 +106,14 @@ find_address(char *name, struct in_addr newaddr, struct in_addr newnetmask)
if (addr.s_addr == newaddr.s_addr &&
netmask.s_addr == newnetmask.s_addr) {
- freeifaddrs(ifap);
- return 0;
+ found = 1;
+ } else {
+ delete_address(name, ioctlfd, addr);
}
}
freeifaddrs(ifap);
- return 1;
+ return found;
}
/*
@@ -124,7 +128,7 @@ set_address(char *name, int ioctlfd, struct in_addr addr,
struct ifaliasreq ifaliasreq;
struct sockaddr_in *in;
- if (find_address(name, addr, netmask) == 0)
+ if (delete_addresses(name, ioctlfd, addr, netmask) == 1)
return;
memset(&ifaliasreq, 0, sizeof(ifaliasreq));