summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjca <jca@openbsd.org>2015-12-01 12:11:31 +0000
committerjca <jca@openbsd.org>2015-12-01 12:11:31 +0000
commitac0d6786da8f0cc1329a2a09bbc507eeebf759a8 (patch)
treea1be08c369056af8d30bcbe9b6bac8662afe00f4
parentThis RTM_GET case can't trigger due to the filtering done above. (diff)
downloadwireguard-openbsd-ac0d6786da8f0cc1329a2a09bbc507eeebf759a8.tar.xz
wireguard-openbsd-ac0d6786da8f0cc1329a2a09bbc507eeebf759a8.zip
Use setsockopt(ROUTE_MSGFILTER) instead of hand-rolled filtering.
ok florian@
-rw-r--r--usr.sbin/rtadvd/if.c8
-rw-r--r--usr.sbin/rtadvd/if.h4
-rw-r--r--usr.sbin/rtadvd/rtadvd.c23
3 files changed, 20 insertions, 15 deletions
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c
index f11389741ce..a1a2e221c10 100644
--- a/usr.sbin/rtadvd/if.c
+++ b/usr.sbin/rtadvd/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.33 2015/12/01 12:09:36 jca Exp $ */
+/* $OpenBSD: if.c,v 1.34 2015/12/01 12:11:31 jca Exp $ */
/* $KAME: if.c,v 1.17 2001/01/21 15:27:30 itojun Exp $ */
/*
@@ -212,10 +212,9 @@ lladdropt_fill(struct sockaddr_dl *sdl, struct nd_opt_hdr *ndopt)
return;
}
-#define FILTER_MATCH(type, filter) ((0x1 << type) & filter)
#define SIN6(s) ((struct sockaddr_in6 *)(s))
char *
-get_next_msg(char *buf, char *lim, size_t *lenp, int filter)
+get_next_msg(char *buf, char *lim, size_t *lenp)
{
struct rt_msghdr *rtm;
struct ifa_msghdr *ifam;
@@ -233,8 +232,6 @@ get_next_msg(char *buf, char *lim, size_t *lenp, int filter)
}
if (rtm->rtm_version != RTM_VERSION)
continue;
- if (FILTER_MATCH(rtm->rtm_type, filter) == 0)
- continue;
switch (rtm->rtm_type) {
case RTM_ADD:
@@ -291,7 +288,6 @@ get_next_msg(char *buf, char *lim, size_t *lenp, int filter)
return (char *)rtm;
}
-#undef FILTER_MATCH
struct in6_addr *
get_addr(char *buf)
diff --git a/usr.sbin/rtadvd/if.h b/usr.sbin/rtadvd/if.h
index b63ef5d934b..2e3cc5cb4cd 100644
--- a/usr.sbin/rtadvd/if.h
+++ b/usr.sbin/rtadvd/if.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.h,v 1.10 2015/11/30 20:58:08 jca Exp $ */
+/* $OpenBSD: if.h,v 1.11 2015/12/01 12:11:31 jca Exp $ */
/* $KAME: if.h,v 1.6 2001/01/21 15:37:14 itojun Exp $ */
/*
@@ -42,7 +42,7 @@ int if_getmtu(char *);
int if_getflags(int, int);
int lladdropt_length(struct sockaddr_dl *);
void lladdropt_fill(struct sockaddr_dl *, struct nd_opt_hdr *);
-char *get_next_msg(char *, char *, size_t *, int);
+char *get_next_msg(char *, char *, size_t *);
struct in6_addr *get_addr(char *);
int get_rtm_ifindex(char *);
int get_ifm_ifindex(char *);
diff --git a/usr.sbin/rtadvd/rtadvd.c b/usr.sbin/rtadvd/rtadvd.c
index 713557a2226..b3b411057a4 100644
--- a/usr.sbin/rtadvd/rtadvd.c
+++ b/usr.sbin/rtadvd/rtadvd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rtadvd.c,v 1.60 2015/11/30 20:58:08 jca Exp $ */
+/* $OpenBSD: rtadvd.c,v 1.61 2015/12/01 12:11:31 jca Exp $ */
/* $KAME: rtadvd.c,v 1.66 2002/05/29 14:18:36 itojun Exp $ */
/*
@@ -348,12 +348,8 @@ rtmsg_input(void)
for (next = msg; next < lim; next += len) {
int oldifflags;
- next = get_next_msg(next, lim, &len,
- RTADV_TYPE2BITMASK(RTM_ADD) |
- RTADV_TYPE2BITMASK(RTM_DELETE) |
- RTADV_TYPE2BITMASK(RTM_NEWADDR) |
- RTADV_TYPE2BITMASK(RTM_DELADDR) |
- RTADV_TYPE2BITMASK(RTM_IFINFO));
+ next = get_next_msg(next, lim, &len);
+
if (len == 0)
break;
type = rtmsg_type(next);
@@ -1244,8 +1240,21 @@ sock_open(void)
static void
rtsock_open(void)
{
+ unsigned int rtfilter;
+
if ((rtsock = socket(PF_ROUTE, SOCK_RAW, 0)) < 0)
fatal("socket");
+
+ rtfilter =
+ ROUTE_FILTER(RTM_ADD) |
+ ROUTE_FILTER(RTM_DELETE) |
+ ROUTE_FILTER(RTM_NEWADDR) |
+ ROUTE_FILTER(RTM_DELADDR) |
+ ROUTE_FILTER(RTM_IFINFO);
+
+ if (setsockopt(rtsock, PF_ROUTE, ROUTE_MSGFILTER,
+ &rtfilter, sizeof(rtfilter)) == -1)
+ fatal("setsockopt(ROUTE_MSGFILTER)");
}
struct rainfo *