diff options
author | Martin Pieuchot <mpi@cvs.openbsd.org> | 2014-08-11 09:47:57 +0000 |
---|---|---|
committer | Martin Pieuchot <mpi@cvs.openbsd.org> | 2014-08-11 09:47:57 +0000 |
commit | 84ed05df3d294b5d3b552d513cb576dbf7bd3bad (patch) | |
tree | cb485bed62fda2edb26241d684140d7856f5c266 /usr.sbin | |
parent | e42b47d8d79b83a06a0e6cd522fea7706ef9a16f (diff) |
Do not try to delete RTF_LOCAL entries. Such routes are automatically
created /deleted by the kernel when an IP address is added/removed
on/from an interface and should not be manipulated by userland tools.
ok henning@, jca@
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/arp/arp.c | 31 | ||||
-rw-r--r-- | usr.sbin/ndp/ndp.c | 11 |
2 files changed, 23 insertions, 19 deletions
diff --git a/usr.sbin/arp/arp.c b/usr.sbin/arp/arp.c index 055b6e8dff7..d18f56a600f 100644 --- a/usr.sbin/arp/arp.c +++ b/usr.sbin/arp/arp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: arp.c,v 1.56 2014/03/18 14:18:22 mikeb Exp $ */ +/* $OpenBSD: arp.c,v 1.57 2014/08/11 09:47:56 mpi Exp $ */ /* $NetBSD: arp.c,v 1.12 1995/04/24 13:25:18 cgd Exp $ */ /* @@ -406,19 +406,22 @@ tryagain: } sin = (struct sockaddr_inarp *)((char *)rtm + rtm->rtm_hdrlen); sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin_len) + (char *)sin); - if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) - if (sdl->sdl_family == AF_LINK && - (rtm->rtm_flags & RTF_LLINFO) && - !(rtm->rtm_flags & RTF_GATEWAY)) - switch (sdl->sdl_type) { - case IFT_ETHER: - case IFT_FDDI: - case IFT_ISO88023: - case IFT_ISO88024: - case IFT_ISO88025: - case IFT_CARP: - goto delete; - } + if (sin->sin_addr.s_addr == sin_m.sin_addr.s_addr) { + if (sdl->sdl_family == AF_LINK && rtm->rtm_flags & RTF_LLINFO) { + if (rtm->rtm_flags & RTF_LOCAL) + return (0); + if (!(rtm->rtm_flags & RTF_GATEWAY)) + switch (sdl->sdl_type) { + case IFT_ETHER: + case IFT_FDDI: + case IFT_ISO88023: + case IFT_ISO88024: + case IFT_ISO88025: + case IFT_CARP: + goto delete; + } + } + } if (sin_m.sin_other & SIN_PROXY) { warnx("delete: can't locate %s", host); diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index 3c387bd2495..1b78be15c62 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ndp.c,v 1.53 2013/10/21 12:41:52 jmc Exp $ */ +/* $OpenBSD: ndp.c,v 1.54 2014/08/11 09:47:56 mpi Exp $ */ /* $KAME: ndp.c,v 1.101 2002/07/17 08:46:33 itojun Exp $ */ /* @@ -506,10 +506,11 @@ delete(char *host) sin = (struct sockaddr_in6 *)((char *)rtm + rtm->rtm_hdrlen); sdl = (struct sockaddr_dl *)(ROUNDUP(sin->sin6_len) + (char *)sin); if (IN6_ARE_ADDR_EQUAL(&sin->sin6_addr, &sin_m.sin6_addr)) { - if (sdl->sdl_family == AF_LINK && - (rtm->rtm_flags & RTF_LLINFO) && - !(rtm->rtm_flags & RTF_GATEWAY)) { - goto delete; + if (sdl->sdl_family == AF_LINK && rtm->rtm_flags & RTF_LLINFO) { + if (rtm->rtm_flags & RTF_LOCAL) + return (0); + if (!(rtm->rtm_flags & RTF_GATEWAY)) + goto delete; } /* * IPv4 arp command retries with sin_other = SIN_PROXY here. |